미둜 탐색

πŸ“„ 문제

문제

N×M크기의 λ°°μ—΄λ‘œ ν‘œν˜„λ˜λŠ” λ―Έλ‘œκ°€ μžˆλ‹€.

λ―Έλ‘œμ—μ„œ 1은 이동할 수 μžˆλŠ” 칸을 λ‚˜νƒ€λ‚΄κ³ , 0은 이동할 수 μ—†λŠ” 칸을 λ‚˜νƒ€λ‚Έλ‹€. μ΄λŸ¬ν•œ λ―Έλ‘œκ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, (1, 1)μ—μ„œ μΆœλ°œν•˜μ—¬ (N, M)의 μœ„μΉ˜λ‘œ 이동할 λ•Œ μ§€λ‚˜μ•Ό ν•˜λŠ” μ΅œμ†Œμ˜ μΉΈ 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€. ν•œ μΉΈμ—μ„œ λ‹€λ₯Έ 칸으둜 이동할 λ•Œ, μ„œλ‘œ μΈμ ‘ν•œ 칸으둜만 이동할 수 μžˆλ‹€.

μœ„μ˜ μ˜ˆμ—μ„œλŠ” 15칸을 μ§€λ‚˜μ•Ό (N, M)의 μœ„μΉ˜λ‘œ 이동할 수 μžˆλ‹€. 칸을 μ…€ λ•Œμ—λŠ” μ‹œμž‘ μœ„μΉ˜μ™€ 도착 μœ„μΉ˜λ„ ν¬ν•¨ν•œλ‹€.

μž…λ ₯

첫째 쀄에 두 μ •μˆ˜ N, M(2 ≤ N, M ≤ 100)이 주어진닀. λ‹€μŒ N개의 μ€„μ—λŠ” M개의 μ •μˆ˜λ‘œ λ―Έλ‘œκ°€ 주어진닀. 각각의 μˆ˜λ“€μ€ λΆ™μ–΄μ„œ μž…λ ₯으둜 주어진닀.

좜λ ₯

첫째 쀄에 μ§€λ‚˜μ•Ό ν•˜λŠ” μ΅œμ†Œμ˜ μΉΈ 수λ₯Ό 좜λ ₯ν•œλ‹€. 항상 λ„μ°©μœ„μΉ˜λ‘œ 이동할 수 μžˆλŠ” 경우만 μž…λ ₯으둜 주어진닀.

🧞 풀이

더보기

풀이

# λ°±μ€€ 2178번 문제: 미둜 탐색

from collections import deque                                                               # 큐λ₯Ό μœ„ν•œ deque 뢈러였기

n, m = map(int, input().split())                                                            # n, m μž…λ ₯ 및 ν• λ‹Ή

dx = [1, -1, 0, 0]                                                                          # 쒌우둜 움직일 수 있게 dx ν• λ‹Ή
dy = [0, 0, 1, -1]                                                                          # μƒν•˜λ‘œ 움직일 수 있게 dy ν• λ‹Ή

maze = []                                                                                   # 미둜λ₯Ό μœ„ν•œ 빈 λ°°μ—΄ ν• λ‹Ή

for _ in range(n):                                                                          # n만큼 반볡
    maze.append(list(map(int, input())))                                                    # 미둜 μž…λ ₯ κ°’ λ°›μ•„μ„œ 2차원 λ°°μ—΄ λ§Œλ“€κΈ°

Q = deque()                                                                                 # 빈 큐 ν• λ‹Ή
check = [[0] * m for _ in range(n)]                                                         # λ°©λ¬Έ μ‹œ 체크할 빈 n * m 크기의 2차원 λ°°μ—΄ ν• λ‹Ή

check[0][0] = -1                                                                            # μ‹œμž‘ 지점은 체크 (-1)둜 ν‘œμ‹œ
Q.append((0, 0, 1))                                                                         # 큐에 0, 0, 1 μΆ”κ°€

while Q:                                                                                    # 큐에 μš”μ†Œκ°€ μžˆλŠ” κ²½μš°μ— 계속 반볡
    x, y, dis = Q.popleft()                                                                 # 큐의 첫 μš”μ†Œλ₯Ό popν•˜μ—¬ x, y, dis에 ν• λ‹Ή

    if x == m - 1 and y == n - 1:                                                           # x ν˜Ήμ€ yκ°€ m, n으둜 끝 μžλ¦¬μ— λ„λ‹¬ν–ˆμ„ λ•Œ,
        print(dis)                                                                          # 거리λ₯Ό λ‚˜νƒ€λ‚΄λŠ” dis κ°’ 좜λ ₯ (BFSλŠ” μ΅œλ‹¨κ±°λ¦¬λ₯Ό 좜λ ₯ν•΄μ€Œ)
        break                                                                               # 반볡문 μ’…λ£Œ

    for i in range(4):                                                                      # μƒν•˜μ’Œμš°λ‘œ 움직여야 ν•˜κΈ°μ— 4만큼 반볡
        nx = dx[i] + x                                                                      # xκ°’ λ³€κ²½ν•˜λ©° 쒌우둜 움직일 수 있게 함
        ny = dy[i] + y                                                                      # yκ°’ λ³€κ²½ν•˜λ©° μƒν•˜λ‘œ 움직일 수 있게 함

        if 0 <= nx < m and 0 <= ny < n and check[ny][nx] != -1 and maze[ny][nx] != 0:       # nx, nyκ°€ 미둜 μ•ˆμ— μžˆμœΌλ©΄μ„œ, λ°©λ¬Έν•˜μ§€ μ•Šμ•˜κ³ , ν•΄λ‹Ή μœ„μΉ˜κ°€ 미둜의 λ²½(0)이 아닐 경우,
                check[ny][nx] = -1                                                          # ν•΄λ‹Ή μœ„μΉ˜λ₯Ό 방문함(-1)둜 λ°”κΏ”μ€Œ
                Q.append((nx, ny, dis + 1))                                                 # Q에 움직인 x, y μœ„μΉ˜μ™€ 1 μΆ”κ°€ν•œ 거리λ₯Ό λ‹€μ‹œ μΆ”κ°€ν•΄ 쀌

+ Recent posts