문제풀이/백준(Boj) 문제풀이

[백준][Dijkstra/다익스트라] 4885. 녹색 옷 입은 애가 젤다지? (파이썬/Python)

얄루몬 2021. 12. 29. 17:17

import heapq
import sys

INF =int(1e9)
input = sys.stdin.readline
dx = [0,0,-1,1]
dy = [1,-1,0,0]
tastcase = 1
def dijsktra():
    q = []
    heapq.heappush(q,(graph[0][0],0,0)) #cost, 시작위치 graph[0][0]을 넣어줌
    dist[0][0] = 0 

    while q:
        cost, x,y = heapq.heappop(q)
        if x == n-1 and y == n-1: #도착했다면?
            print(f"Problem {tastcase}: {dist[x][y]}")
            break
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            
            if 0 <= nx < n and 0 <= ny < n:
                newCost = cost + graph[nx][ny]

                #새로운 cost가 현재까지의 cost보다 작다면 그쪽으로 진행한다. 
                if newCost < dist[nx][ny]:
                    dist[nx][ny] = newCost
                    heapq.heappush(q,(newCost,nx,ny))


while True:
    n = int(input())
    if n == 0:
        break
    
    graph = []
    dist = [[INF] * n for _ in range(n)]
    for i in range(n):
        graph.append(list(map(int,input().split())))
    dijsktra()
    tastcase += 1

# 최소 비용을 구하는 문제인데, 이때 가중치가 존재하기 때문에 BFS로는 구할 수 없다. 

# 각 노드에서 4방향을 다 돌면서 가장 작은 비용으로 이동하는 곳으로 옮겨가며 진행한다. 

# 위의 코드에서 dist --> minCost를 의미한다 ! 

# 또한 다익스트라 알고리즘은 heap을 사용해서 푼다. (BFS는 deque) 

    # heap은 완전 이진 트리의 일종으로 우선 순위 큐를 위해 만들어진 자료구조이다.

    # heap은 최댓값 최솟값을 찾기 위해 만들어졌다.