전형적인 BFS
문제다. 방향좌표 dx
, dy
를 활용하여 map 을 최단거리로 이동해야 한다.
visited
리스트에는 현재 위치에 거리가 저장된다.
visited[0][0] = 1
로, queue
에는 (0, 0)
을 넣어 초기화한다.
queue
의 아이템을 하나씩 빼면서 비지 않을 때 까지 돌고,
queue
에서 빼낸 현재 위치에서 방향좌표에 따라 한 step 씩 움직이며
visited
와 queue
를 업데이트 한다.
visited
의 마지막 위치(visited[-1][-1]
)를 반환한다.
import collections
def solution(maps):
return bfs(maps)
def bfs(maps):
dy, dx = [0, -1, 0, 1], [1, 0, -1, 0]
n, m = len(maps), len(maps[0])
visited = [[-1] * m for _ in range(n)]
visited[0][0] = 1
queue = collections.deque([(0, 0)])
while queue:
y, x = queue.popleft()
for i in range(4):
ny, nx = y + dy[i], x + dx[i]
if 0 <= ny < n and 0 <= nx < m:
if visited[ny][nx] == -1 and maps[ny][nx] == 1:
visited[ny][nx] = visited[y][x] + 1
queue.append((ny, nx))
return visited[-1][-1]
행렬 map을 다룰 때 주의할 점
n * m
행렬에서 행 == n == y 이다.
위치를 표현할 때 (x, y)
라고 말하지만 실제 x
위치에는 행에 해당하는 y
를 놓고 문제를 풀어야 한다.
아래 둘은 다르다.
visited = [[-1] * m] * n
visited = [[-1] * m for _ in range(n)]