코딩 테스트/프로그래머스 level2
배달 힙 다익스트라
fullfish
2025. 10. 16. 09:35

import heapq as hq
def solution(N, road, K):
graph = [[] for _ in range(N + 1)]
for a, b, c in road:
graph[a].append((b, c))
graph[b].append((a, c))
distance = [float("inf") for _ in range(N + 1)]
distance[1] = 0
heap = [(0, 1)] # 시간, 위치
while heap:
time, now = hq.heappop(heap)
if time > distance[now]:
continue
for next, cost in graph[now]:
new_time = time + cost
# 더 적은 시간 갱신
if new_time < distance[next]:
distance[next] = new_time
hq.heappush(heap, (new_time, next))
return sum(d <= K for d in distance)
print(solution(N, road, K))
"""
1번 마을로 부터 가까운 마을부터 확장시키며
더 짧게 갈 수 있는지 계속 업데이트
모두 돌면
1번 마을로부터의 최소 거리들이 나옴
""" ""
다익스트라(Dijkstra) 알고리즘이란?
한 지점(출발점)에서 모든 다른 지점까지의 최소 이동 거리(또는 최소 시간)를 구하는 알고리즘이야.
- 힙 다익스트라: 매번 현재까지 시간이 가장 작은 정점을 꺼내서 확정 → 최단거리 불변성 유지
- 일반 큐 BFS: 들어온 순서대로 꺼냄 → 더 오래 걸리는 경로가 먼저 처리될 수 있음 → 오답이 되거나, 여러 번 재방문해야 해서 비효율 폭증
BFS는 거리나 시간이 1로 동일해야지 쓸 수 있음
- 다익스트라(Dijkstra) 는 "가중치가 양수인 그래프"의 최단거리를 구하는 알고리즘이고,
- BFS 는 "모든 간선의 가중치가 동일(1)"인 그래프의 최단거리를 구하는 특수한 경우야.
즉,
가중치가 전부 1인 그래프에서는 다익스트라가 BFS와 완전히 동일한 결과를 낸다.
단지 구현이 더 복잡하고, 성능이 살짝 느릴 뿐이야.
가중치 1인 그래프에서 시작점에서 제일 몇 노드들 개수 구하기 같은건 BFS