풀이


[0][0] 에서 [n-1][m-1] 좌표까지의 최단거리 문제이기 때문에 BFS 를 활용했다.

이제 기본적인 BFS 구조는 이해했고 다양한 방면에서 활용할 수 있다.

”아기상어” 문제에서 활용했던 dist 배열을 통해 미로를 탐색하면서 각 좌표별 시작점부터의 거리를 저장하도록 코드를 작성했다.

시작점에서 BFS 를 실행시켜 모든 탐색이 끝난 후 dist[n-1][m-1] 을 반환하여 최단거리를 계산할 수 있다.

소스코드


# 미로 탐색
from collections import deque
import sys
input = sys.stdin.readline
 
def bfs(i, j):
    q = deque()
    q.append([i, j])
    graph[i][j] = 0  # 시작 점 방문처리
    dist[i][j] = 1
    while q:
        x, y = q.popleft()
        for k in range(4):
            nx = x + dx[k]
            ny = y + dy[k]
            if 0 <= nx < n and 0 <= ny < m:  # 범위 내일 때
                if graph[nx][ny] == 1:  # 통로일 경우
                    q.append([nx, ny])
                    graph[nx][ny] = 0  # 방문 처리
                    dist[nx][ny] = dist[x][y] + 1  # 좌표별 거리 저장
    return dist[n-1][m-1]
 
 
dx = [1, -1, 0, 0]
dy = [0, 0, -1, 1]
 
n, m = map(int, input().split())
graph = [list(map(int, input().rstrip())) for _ in range(n)]
dist = [[0] * m for _ in range(n)]
 
print(bfs(0, 0))

References