크기의 배열로 표현되는 미로가 주어집니다. 1은 이동할 수 있는 칸, 0은 이동할 수 없는 칸을 나타냅니다. 에서 출발하여 의 위치로 이동할 때 지나야 하는 최소의 칸 수(최단 거리) 를 구하는 문제입니다.
미로 찾기 문제에서 '최단 거리'를 구하라고 한다면, 깊이 우선 탐색(DFS)이 아닌 너비 우선 탐색(BFS) 을 사용하는 것이 정석입니다. BFS는 시작점에서 가까운 노드부터 차례대로(Level by Level) 탐색하기 때문에, 목적지에 도달하는 순간이 곧 최단 거리임이 보장되기 때문입니다.
dx = [-1, 1, 0, 0], dy = [0, 0, -1, 1]을 사용하여 상하좌우 이동을 제어합니다.visited)을 만들지 않고, 큐에서 새로운 좌표 (nx, ny)를 발견할 때마다 graph[nx][ny] = graph[x][y] + 1 과 같이 이전 좌표의 값에 1을 더해 줍니다. (nx, ny)가 목적지인 (N-1, M-1)에 도달했다면, 더 이상 큐를 돌릴 필요 없이 계산된 값을 즉시 반환하여 실행 시간을 최적화합니다.import sys
from collections import deque
input = sys.stdin.readline
N, M = map(int, input().split())
graph = [list(map(int, input().strip())) for _ in range(N)]
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs(start_x, start_y):
queue = deque([(start_x, start_y)])
while queue:
x, y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
# 미로 범위 내에 있고, 갈 수 있는 길(1)인 경우
if 0 <= nx < N and 0 <= ny < M and graph[nx][ny] == 1:
queue.append((nx, ny))
# 핵심: 이전 칸의 거리 값에 1을 더하여 최단 거리 기록
graph[nx][ny] = graph[x][y] + 1
# 목적지에 도착하면 즉시 반환
if nx == N - 1 and ny == M - 1:
return graph[nx][ny]
print(bfs(0, 0))
visited 배열을 만들곤 했는데, 이렇게 입력받은 graph 배열의 데이터를 직접 가공(In-place 방식)하여 거리 배열과 방문 체크 배열 두 가지 용도로 동시에 활용하니 코드 라인 수도 줄고 메모리도 아낄 수 있어 매우 효율적이었습니다.