count
변수에 + 1
해서 흰 방보다 늦게 탐색되게 하고, 동시에 검은 방의 개수를 셀 수 있도록 한다. BFS 알고리즘은 최단거리를 보장하는데
우선순위 큐(최소 힙)를 이용하여 흰 방을 우선적으로 탐색하기 때문에
검은 방을 최소한으로 거치면서 목적지에 도착할 수 있다.
import sys
import heapq
input = sys.stdin.readline
n = int(input())
maze = []
for _ in range(n):
maze.append(list(map(int, input().rstrip())))
# 2차원 리스트에서 상하좌우 이동을 위한 dirction x, direction y 변수 선언
dx = [1, -1 ,0, 0]
dy = [0, 0, 1, -1]
# 방문 여부 체크를 위한 visited 2차원 리스트
visited = [[False] * n for _ in range(n)]
def bfs(x, y):
heap = []
heapq.heappush(heap, (0, x, y))
while heap:
count, cx, cy = heapq.heappop(heap)
visited[cx][cy] = True
# 도착지점에 도착했을 경우
if cx == (n - 1) and cy == (n - 1):
return count
# 상하좌우로 한칸씩 이동하여 탐색 진행
for i in range(4):
nx = cx + dx[i]
ny = cy + dy[i]
if (0 <= nx < n) and (0 <= ny < n) and not visited[nx][ny]:
# 방문처리
visited[nx][ny] = True
# 흰 방
if maze[nx][ny] == 1:
heapq.heappush(heap, (count, nx, ny))
# 검은 방
else:
heapq.heappush(heap, (count + 1, nx, ny))
print(bfs(0, 0))