Algorithm/백준_생각정리
백준_5972_택배 배송(python)
코친남
2023. 4. 5. 23:55
※ 접근법
문제에서 시작 지점이 주어지고 그 지점에서 최단 거리를 구하는 문제였기 때문에 다익스트라 알고리즘을 떠올렸고
노드의 개수가 최대 오만 개로 많았기 때문에 우선순위 큐를 이용한 다익스트라 알고리즘 문제로 풀어야겠다고 생각했다.
※ 풀이
1. 풀이법은 우선순위 큐를 이용한 다익스트라 구현과 너무 똑같기 때문에 주석으로 코드 한줄 한줄이 무엇을 의미하는지 달아놓겠습니다. (한 가지 틀린점이 있다면 문제에서 양방향이라고 말을 해줬기 때문에 입력받을 때 양방향으로 받았습니다.)
import sys, heapq
input = sys.stdin.readline
n, m = map(int,input().split())
INF = float("inf") # 무한대 상수 선언
graph = [[] for _ in range(n+1)] # 노드와 노드 사이의 거리를 담을 graph 리스트 선언
distance = [INF] * (n+1) # 처음에는 각 지점의 거리를 무한대로 distance 노드의 갯수만큼 초기화
for i in range(m): # 간선의 갯수만큼
a, b, c = map(int,input().split())
graph[a].append((b,c))
graph[b].append((a,c)) # 노드 위치와 비용순으로 graph에 집어넣습니다.
def dijkstra(s):
q = []
distance[s] = 0 # 자기자신과의 거리는 0으로 초기화합니다.
heapq.heappush(q,(0,s)) # q에 (거리, 위치)를 담습니다.
while q:
dist, cur = heapq.heappop(q)
if distance[cur] < dist: # 이미 계산돼 있는 최솟값보다 크다면 확인할 필요도 없으니 다음 반복으로 넘어갑니다.
continue
for next in graph[cur]: # 이웃돼 있는 노드를 확인합니다.
cost = dist + next[1] # dist 출발 지점에서 현재 노드까지의 거리 + 현재 노드에서 다음 노드까지의 거리
if cost < distance[next[0]]: # 이미 계산돼 있는 최솟값이 더 작았다면 갱신해줍니다.
distance[next[0]] = cost
heapq.heappush(q,(cost, next[0])) # 새로운 최솟값을 q에 넣고 다음 반복을 진행해줍니다.
return distance[n]
print(dijkstra(1))
※ 회고
느리더라도 꾸준하게