

Life is a maze and love is a riddle (인생은 미로 사랑은 수수께끼)
1의 거리 비용이 발생한다.
1인 간선도 있고 0인 간선도 있습니다. # 미로의 시작 칸과, 미로 각 칸의 거리
N = int(input())
grid = [] # 미로 정보
for _ in range(N):
grid.append(list(map(int, input().strip())))
INF = float('inf')
# 미로의 시작 칸과, 미로 각 칸의 거리
distance = [[INF] * N for _ in range(N)]
distance[i][j]는 미로의 시작 칸과, 미로의 i행 j열 칸 간 최단 거리를 나타냅니다.def djikstra():
# (거리, x좌표, y좌표) 꼴로 푸시
queue = []
# 시작점 x=0 y=0, 거리는 0으로 설정
heapq.heappush(queue, (0, 0, 0))
distance[0][0] = 0
# 상, 좌, 하, 우 순서대로
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
# (이후코드에서 계속)
(거리, x좌표, y좌표)를 푸시해줍니다.heappop으로 원소를 꺼낼 때는, 첫 값인 거리가 최솟값인 튜플부터 반환됩니다.
def djikstra():
# (이전코드에서 계속)
# 다익스트라 알고리즘
while queue:
dist, x, y = heapq.heappop(queue)
if distance[x][y] < dist:
continue
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
# 범위를 안 벗어나는지 확인
if 0 <= nx < N and 0 <= ny < N:
if grid[nx][ny] == 1: # 흰 방 (1)
new_dist = dist
else: # 검은 방 (0)
new_dist = dist + 1
# 기존에 구한 거리보다 짧으면 갱신 및 힙에 푸시
if new_dist < distance[nx][ny]:
distance[nx][ny] = new_dist
heapq.heappush(queue, (new_dist, nx, ny))
(x, y)와 인접한 (nx, ny)를 확인하는 부분에선i를 순회하며 dx[i], dy[i]을 x, y에 더해 nx, ny를 계산함으로써, 상하좌우를 둘러보는 식으로 구현할 수 있습니다.dist를 그대로 사용합니다.dist에 1을 더해 주어야 합니다.print(distance[-1][-1])로 마지막 칸까지의 최단거리를 출력하면 됩니다.import heapq
import sys
input = sys.stdin.readline
N = int(input())
grid = [] # 미로 정보
for _ in range(N):
grid.append(list(map(int, input().strip())))
INF = float('inf')
# 미로의 시작 칸과, 미로 각 칸의 거리
distance = [[INF] * N for _ in range(N)]
def djikstra():
# (거리, x좌표, y좌표) 꼴로 푸시
queue = []
# 시작점 x=0 y=0, 거리는 0으로 설정
heapq.heappush(queue, (0, 0, 0))
distance[0][0] = 0
# 상, 좌, 하, 우 순서대로
dx = [-1, 0, 1, 0]
dy = [0, -1, 0, 1]
# 다익스트라 알고리즘
while queue:
dist, x, y = heapq.heappop(queue)
if distance[x][y] < dist:
continue
for i in range(4):
nx, ny = x + dx[i], y + dy[i]
# 범위를 안 벗어나는지 확인
if 0 <= nx < N and 0 <= ny < N:
if grid[nx][ny] == 1: # 흰 방 (1)
new_dist = dist
else: # 검은 방 (0)
new_dist = dist + 1
# 기존에 구한 거리보다 짧으면 갱신 및 힙에 푸시
if new_dist < distance[nx][ny]:
distance[nx][ny] = new_dist
heapq.heappush(queue, (new_dist, nx, ny))
djikstra()
# 첫 칸에서 마지막 칸까지 거리
print(distance[-1][-1])