NxM 직사각형 미로에 있는 괴물을 피해 탈출해야한다. 현 위치는 (1,1)이고 출구는 (N,M)에 존재하며 한 번에 한 칸씩 이동할 수 있다. 괴물이 있는 부분은 0이고 없는 부분은 1이다. 미로는 반드시 탈출 가능하고, 이때 탈출하기 위해 움직여야 하는 최소 칸의 개수를 구하시오. 칸을 셀 때는 시작 칸과 마지막 칸을 모두 포함해서 계산한다.
풀이
처음 봤을 때는 아까 풀었던 dfs문제와 뭐가 다른거지? 라는 생각이 들었다. 근데 만약 1인 부분 중에 한 곳을 정해서 깊에 쭈욱 들어갔는데 만약 막다른 길이었다면 최소 이동이 될 수 없을 것 같고 그냥 헛짓거리를 한 것이 된다. 그럼 그 길만큼 다시 나가야하고...
그렇다면 bfs 문제가 맞는 것 같다. 현 위치에서 갈 수 있는 곳을 모두 가보는 것이다. 그리고 그 같은 레벨에서 갈 수 있는 곳을 모두 살펴보고.. 이런식으로 진행하면 만약 0인 괴물을 만나면 그곳으로는 더 이상안갈테니 끝나고!
소스코드
from collections import deque
n, m = map(int,input().split())
graph = []
for i in range(n):
graph.append(list(map(int, input())))
#이동할 네 방향 정의 - 상하좌우
dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
def bfs(x, y):
queue = deque()
queue.append((x,y))
while queue:
x,y = queue.popleft()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if nx < 0 or ny < 0 or nx >= n or ny >= m:
continue
if graph[nx][ny] == 0:
continue
if graph[nx][ny] == 1:
graph[nx][ny] = graph[x][y] + 1
queue.append((nx,ny))
return graph[n-1][m-1] #탈출한경우 카운트
print(bfs(0,0))