Develop/algorithm

이것이 코딩테스트다 39 화성 탐사 (Python)

미니문92 2021. 9. 3. 02:04

문제 링크

화성 탐사 기계가 존재하는 공간은 N x N 2차원 공간이며 각각의 칸을 지나기 위한 비용이 존재한다. 가장 왼쪽 칸에서 가장 오른쪽 아래 칸인 위치로 이동하는 최소 비용을 출력하는 프로그램을 작성하세요.


Test Case

입력
3
3
5 5 4
3 9 1
3 2 7
5
3 7 2 0 1
2 8 0 9 1
1 2 1 8 1
9 8 9 2 0
3 6 5 1 5
7
9 0 5 1 1 5 3
4 1 2 1 6 5 3
0 7 6 1 6 8 5
1 1 7 8 3 2 3
9 4 0 7 6 4 1
5 8 3 2 4 8 3
7 4 8 4 8 3 4

출력
20
19
36


문제 풀이

기존에 이코테 책에서 나오던 다익스트라 스타일이 아닌 문제. 기존에 풀던 다익스트라 문제는 노드1에서 노드2로 가는 비용을 주어지는 식으로 출제됐는데, 이 문제는 2차원 배열로 각 노드사이의 거리들을 모두 주어지고 최단거리를 구하는 문제이다. 
다익스트라 코드도 잘 못외웠는데 거기에 2차원 배열로 코드를 짜려니 손도 잘 못 댔다. 꼭 나중에 다시 풀어봐야할 문제!


Source Code

import sys
import heapq
INF = int(1e9)
input = sys.stdin.readline

dx = [0,1,0,-1]
dy = [1,0,-1,0]

t = int(input())

for _ in range(t):
    n = int(input())
    graph = []
    for i in range(n):
        graph.append(list(map(int, input().split())))
    distance = [[INF] * n for _ in range(n)]

    x,y = 0,0
    q = [(graph[x][y], x,y)]
    distance[x][y] = graph[x][y]

    while q:
        dist,x,y = heapq.heappop(q)
        if distance[x][y] < dist:
            continue
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]

            if nx < 0 or nx >= n or ny < 0 or ny >= n:
                continue
            cost = dist + graph[nx][ny]
            if cost < distance[nx][ny]:
                 distance[nx][ny] = cost
                 heapq.heappush(q,(cost,nx,ny))
    
    print(distance[n-1][n-1])