heapq) 자료구조를 활용한다.grid (2차원 리스트): 입력받은 지도의 가중치 정보 저장dist (2차원 리스트): 출발지로부터 각 위치 까지 도달하는 최소 비용을 기록. 초기값은 무한대(float('inf'))로 설정한다.pq (우선순위 큐): 누적 비용이 가장 낮은 경로를 먼저 꺼내기 위해 (누적 비용, y, x) 형태의 튜플을 담는 최소 힙으로 구현한다.작성한 코드의 다익스트라 함수는 다음과 같은 흐름으로 작동한다.
초기화
dist[0][0] = grid[0][0]pq에 초기 상태인 (grid[0][0], 0, 0)을 삽입한다.루프 및 유효성 검사
(curr_dist, sy, sx)를 꺼낸다 (heapq.heappop).curr_dist가 이미 기록된 최소 비용인 dist[sy][sx]보다 크다면, 이는 이미 더 짧은 경로가 발견된 것이므로 무시하고 넘어간다 (continue).(N-1, N-1)에 도달했다면 가중치가 최소인 경로를 찾은 것이므로 즉시 탐색을 종료하고 반환한다.인접 노드 탐색 및 완화(Relaxation)
(sy, sx)에서 상, 하, 좌, 우 4방향으로 이동할 다음 위치 (ny, nx)를 계산한다.0 <= ny < N 및 0 <= nx < N)인 경우, 다음 칸까지의 예상 비용을 계산한다:next_dist = curr_dist + grid[ny][nx]next_dist가 기존에 기록되어 있던 최소 비용 dist[ny][nx]보다 작다면:next_dist로 갱신(완화)한다.heapq.heappush(pq, (next_dist, ny, nx))import heapq
# 상 우 하 좌
dx = [0, 1, 0, -1]
dy = [-1, 0 ,1, 0]
def dijkstra():
dist[0][0] = grid[0][0]
# (누적 비용, y, x)
pq = [(grid[0][0], 0, 0)]
while pq:
curr_dist, sy, sx = heapq.heappop(pq)
# 최적화: 이미 방문하여 더 작은 값으로 갱신되었다면 스킵
if curr_dist > dist[sy][sx]:
continue
# 도착점에 도달했다면 종료
if sy == N-1 and sx == N-1:
return
for i in range(4):
ny, nx = sy + dy[i], sx + dx[i]
if 0 <= ny < N and 0 <= nx < N:
next_dist = curr_dist + grid[ny][nx]
# 가중치 완화 조건 조건
if next_dist < dist[ny][nx]:
dist[ny][nx] = next_dist
heapq.heappush(pq, (next_dist, ny, nx))
T = int(input())
for tc in range(1, T+1):
N = int(input())
grid = [list(map(int, input())) for _ in range(N)]
dist = [[float('inf')] * N for _ in range(N)]
dijkstra()
print(f"#{tc} {dist[N-1][N-1]}")