hugDog
Android DevLog
hugDog
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๐Ÿ™Œ Hello? (162)
    • ๐Ÿงฉ์•ˆ๋“œ๋กœ์ด๋“œ (12)
      • ๊ฐœ๋… ์ •๋ฆฌ (5)
      • ๋ฒ„๊ทธ ํ•ด๊ฒฐ (4)
      • ๊ธฐํƒ€ (3)
    • ๐Ÿ”์•Œ๊ณ ๋ฆฌ์ฆ˜ (54)
      • ๊ฐœ๋… (0)
      • ๋ฐฑ์ค€ (48)
      • ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค (6)
    • ๐Ÿ“„๊ฐœ๋ฐœ ์ผ์ง€ (0)
      • FINPO (0)
    • ๐Ÿ”คํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด (71)
      • C++ ์ •๋ฆฌ (49)
      • C++๊ธฐ์ดˆํ”Œ๋Ÿฌ์Šค ์—ฐ์Šต๋ฌธ์ œ (20)
      • Kotlin (2)
    • โญProject (1)
    • ๐ŸšดTIL (13)
      • Clean Code (13)
    • ๐Ÿšฉ๊ธฐํƒ€ (9)
      • ๋ชฉํ‘œ (6)
      • ์ผ์ƒ (3)
      • ๋ฌธ์„œ (0)

์ธ๊ธฐ ๊ธ€

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
hugDog
๐Ÿ”์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[Python/ํŒŒ์ด์ฌ] ๋ฐฑ์ค€ 3055๋ฒˆ: ํƒˆ์ถœ

[Python/ํŒŒ์ด์ฌ] ๋ฐฑ์ค€ 3055๋ฒˆ: ํƒˆ์ถœ
๐Ÿ”์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€

[Python/ํŒŒ์ด์ฌ] ๋ฐฑ์ค€ 3055๋ฒˆ: ํƒˆ์ถœ

2022. 1. 6. 15:02
728x90

๋ฌธ์ œ

 

ํ’€์ด

์ž…๋ ฅ๋ฐ›๋Š” ์ฝ”๋“œ

from collections import deque
input = __import__('sys').stdin.readline

r, c = map(int, input().split())
graph = [list(input().strip()) for _ in range(r)]
waterVisited = [[False] * c for _ in range(r)]
dociVisited = [[False] * c for _ in range(r)]
water = deque()
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

 

๊ตด, ๊ณ ์Šด๋„์น˜, ๋ฌผ์˜ ์œ„์น˜๋ฅผ ์ฐพ์•„์ฃผ์—ˆ๋‹ค.

๋ฌผ ๊ฐ™์€ ๊ฒฝ์šฐ bfs๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฏ€๋กœ deque์— ๋„ฃ์—ˆ๋‹ค.

# ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •
for i in range(r):
    for j in range(c):
        if graph[i][j] == 'D':
            cave = (i, j)
        if graph[i][j] == 'S':
            doci = (i, j, 0)
            dociVisited[i][j] = True
        if graph[i][j] == '*':
            water.append((i, j, 0))
            waterVisited[i][j] = True

 

๋ฌผ์˜ ํ๋ฆ„์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ

์ƒˆ๋กœ ์ถ”๊ฐ€๋œ ๋ฌผ์€ ๋‹ค์Œ ์‹œ๊ฐ„์— ํ๋ฅด๋ฏ€๋กœ ๊ธฐ์กด์— ์žˆ๋˜ ๋ฌผ์˜ ์ˆ˜๋งŒํผ๋งŒ ๋ฐ˜๋ณต๋ฌธ ์ˆ˜ํ–‰

def waterFlow():
    for _ in range(len(water)):
        i, j, cnt = water.popleft()
        move(i, j, 0, waterVisited, 'D', 'X', water, True)

 

๊ณ ์Šด๋„์น˜์˜ ์ด๋™์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ฝ”๋“œ

prevCnt๋ฅผ ํ†ตํ•ด ์‹œ๊ฐ„์ด ํ˜๋ €์„ ๋•Œ๋งŒ ๋ฌผ์ด ํ๋ฅด๊ฒŒ ๊ตฌํ˜„ (ํ์˜ ํŠน์ง•์„ ์•Œ๋ฉด ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋‹ค)

def moveDoci():
    q = deque()
    q.append(doci)
    cnt = 0
    prevCnt = -1
    while q:
        i, j, cnt = q.popleft()
        if prevCnt < cnt:
            prevCnt = cnt
            waterFlow()
        if ((i, j) == cave):
            print(cnt)
            return
        move(i, j, cnt, dociVisited, '*', 'X', q, False)
    print("KAKTUS")

 

move ํ•จ์ˆ˜

๊ณ ์Šด๋„์น˜์™€ ๋ฌผ์˜ ์ด๋™์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•œ๋‹ค.

cnt์˜ ๊ฒฝ์šฐ ๊ณ ์Šด๋„์น˜์—๋งŒ ํ•„์š”ํ•œ ๋ณ€์ˆ˜์ด๊ณ 

mark๊ฐ€ True์ธ ๊ฒฝ์šฐ ํ•ด๋‹น ์œ„์น˜๋ฅผ ๋ฌผ๋กœ ์ฑ„์šด๋‹ค.

def move(i ,j, cnt, visited, s1, s2, que, mark):
    for idx in range(4):
        ni, nj = i + dy[idx], j + dx[idx]
        if check(ni, nj, visited, s1, s2): continue
        que.append((ni, nj, cnt + 1))
        visited[ni][nj] = True
        if mark: graph[ni][nj] = '*'

check ํ•จ์ˆ˜

๋ฐฐ์—ด์ด ๊ฐ’์„ ๋ฒ—์–ด๋‚˜์ง€ ์•Š์•˜๋Š”์ง€ ๋“ฑ์„ ์ฒดํฌํ•˜๋Š” ํ•จ์ˆ˜

def check(ni, nj, visited, s1, s2):
    return ni < 0 or ni >= r or nj < 0 or nj >= c or visited[ni][nj] or graph[ni][nj] == s1 or graph[ni][nj] == s2

 

์ฝ”๋“œ

from collections import deque
input = __import__('sys').stdin.readline

r, c = map(int, input().split())
graph = [list(input().strip()) for _ in range(r)]
waterVisited = [[False] * c for _ in range(r)]
dociVisited = [[False] * c for _ in range(r)]
water = deque()
dx = [0, 0, -1, 1]
dy = [1, -1, 0, 0]

# ์ดˆ๊ธฐ๊ฐ’ ์„ค์ •
for i in range(r):
    for j in range(c):
        if graph[i][j] == 'D':
            cave = (i, j)
        if graph[i][j] == 'S':
            doci = (i, j, 0)
            dociVisited[i][j] = True
        if graph[i][j] == '*':
            water.append((i, j, 0))
            waterVisited[i][j] = True
      
def waterFlow():
    for _ in range(len(water)):
        i, j, cnt = water.popleft()
        move(i, j, 0, waterVisited, 'D', 'X', water, True)
                   
def check(ni, nj, visited, s1, s2):
    return ni < 0 or ni >= r or nj < 0 or nj >= c or visited[ni][nj] or graph[ni][nj] == s1 or graph[ni][nj] == s2

def moveDoci():
    q = deque()
    q.append(doci)
    cnt = 0
    prevCnt = -1
    while q:
        i, j, cnt = q.popleft()
        if prevCnt < cnt:
            prevCnt = cnt
            waterFlow()
        if ((i, j) == cave):
            print(cnt)
            return
        move(i, j, cnt, dociVisited, '*', 'X', q, False)
    print("KAKTUS")

def move(i ,j, cnt, visited, s1, s2, que, mark):
    for idx in range(4):
        ni, nj = i + dy[idx], j + dx[idx]
        if check(ni, nj, visited, s1, s2): continue
        que.append((ni, nj, cnt + 1))
        visited[ni][nj] = True
        if mark: graph[ni][nj] = '*'
        
moveDoci()

 

๋งˆ๋ฌด๋ฆฌ

์ €๋ฒˆ์— ํ‘ผ ๊ณจ๋“œ 1 ๋ฌธ์ œ๋ณด๋‹ค๋Š” ์‰ฌ์›Œ์„œ ๊ธˆ๋ฐฉ ํ’€์—ˆ๋‹ค ใ…Žใ…Ž

 

728x90
์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ (์ƒˆ์ฐฝ์—ด๋ฆผ)
  • ๋ฌธ์ œ
  • ํ’€์ด
  • ์ฝ”๋“œ
  • ๋งˆ๋ฌด๋ฆฌ
'๐Ÿ”์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [Python/ํŒŒ์ด์ฌ] ๋ฐฑ์ค€ 2146๋ฒˆ: ๋‹ค๋ฆฌ ๋งŒ๋“ค๊ธฐ
  • [Python/ํŒŒ์ด์ฌ] ๋ฐฑ์ค€ 1726๋ฒˆ: ๋กœ๋ด‡
  • [Python/ํŒŒ์ด์ฌ] ๋ฐฑ์ค€ 16933๋ฒˆ: ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ 3
  • [Python/ํŒŒ์ด์ฌ] ๋ฐฑ์ค€ 16946๋ฒˆ: ๋ฒฝ ๋ถ€์ˆ˜๊ณ  ์ด๋™ํ•˜๊ธฐ 4
hugDog
hugDog
์•ˆ๋“œ๋กœ์ด๋“œ ๊ณต๋ถ€ ์ค‘์ธ ํ•™์ƒ์ž…๋‹ˆ๋‹ค!

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

๋‹จ์ถ•ํ‚ค

๋‚ด ๋ธ”๋กœ๊ทธ

๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
Q
Q
์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
W
W

๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
E
E
๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
C
C

๋ชจ๋“  ์˜์—ญ

์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
S
S
๋งจ ์œ„๋กœ ์ด๋™
T
T
ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
H
H
๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
Shift + /
โ‡ง + /

* ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.