코딩하는 해맑은 거북이

[Python] 녹색 옷 입은 애가 젤다지? - 백준 (최단경로) 본문

코딩테스트

[Python] 녹색 옷 입은 애가 젤다지? - 백준 (최단경로)

#CJE 2023. 10. 3.
해당 글은 백준 4485번 '녹색 옷 입은 애가 젤다지?' 문제를 다룬다.

문제

https://www.acmicpc.net/problem/4485

4485번: 녹색 옷 입은 애가 젤다지?

젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주

www.acmicpc.net

 

설명

(0, 0)에서 (n-1, n-1)까지 이동할 때 최소 비용으로 가야하므로 최단 경로를 구하는 알고리즘 중 다익스트라를 활용하면 된다.
이때 주의할 점은 heapq를 사용하므로 heappush할 때 비용이 먼저 위치하도록 한다!

 

코드

import heapq

dx = [-1, 1, 0, 0]
dy = [0, 0, -1, 1]
INF = int(1e9)

def dijkstra():
    distance = [[INF]*n for _ in range(n)]
    distance[0][0] = arr[0][0]
    q = []
    heapq.heappush(q, (arr[0][0], 0, 0))
    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 and nx < n and ny >= 0 and ny < n:
                cost = dist + arr[nx][ny]
                if cost < distance[nx][ny]:
                    distance[nx][ny] = cost
                    heapq.heappush(q, (cost, nx, ny))
    return distance[n-1][n-1]

t = 1
while True:
    n = int(input())
    if n == 0:
        break
    arr = []
    for i in range(n):
        arr.append(list(map(int, input().split())))
    result = dijkstra()
    print(f'Problem {t}: {result}')
    t += 1

     

 
 

Comments