chldkato

백준 4485 녹색 옷 입은 애가 젤다지? (파이썬) 본문

백준

백준 4485 녹색 옷 입은 애가 젤다지? (파이썬)

chldkato 2020. 2. 17. 01:54

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

 

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

문제 젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주인공, 링크는 지금 도둑루피만 가득한 N x N 크기의 동굴의 제일 왼쪽 위에 있다. [0][0]번 칸이기도 하다. 왜 이런 곳에 들어왔냐고 묻는다면 밖에서 사람들이 자꾸 "젤다의 전설에 나오는 녹색 애가 젤다지?"라고 물어봤기 때문이다. 링크가 녹색 옷을 입

www.acmicpc.net

(0,0)에서 (n-1,n-1)까지 도둑루피의 크기가 최소가 되는 경로를 다익스트라로 구한 후 잃는 루피 값을 출력

from heapq import heappush, heappop
import sys

INF = sys.maxsize
input = sys.stdin.readline

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

def dij(cnt):
    d, q = [[INF]*n for _ in range(n)], []
    heappush(q, [a[0][0], 0, 0])
    d[0][0] = 0
    while q:
        w, x, y = heappop(q)
        if x == n-1 and y == n-1:
            print("Problem {0}: {1}".format(cnt, w))
            return
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0 <= nx < n and 0 <= ny < n:
                nw = w + a[nx][ny]
                if nw < d[nx][ny]:
                    d[nx][ny] = nw
                    heappush(q, [nw, nx, ny])

cnt = 1
while True:
    n = int(input())
    if n == 0:
        break
    a = [list(map(int, input().split())) for _ in range(n)]
    dij(cnt)
    cnt += 1

Comments