[Python] 배달
코딩테스트 합격자되기 파이썬 편- 문제 44
문제 > https://school.programmers.co.kr/learn/courses/30/lessons/12978
✅ 문제 접근
“모든” 마을이 k 거리(가중치) 내에 있는 지의 여부를 알아야 한다.
간선 개수가 아닌 가중치의 합을 기준으로 최단 경로를 탐색해야 한다.
⇒ 다익스트라, 벨만-포드, 플로이드-워셜 알고리즘, …
✅ 기능
그래프 정보를 딕셔너리로 표현: {노드: (이웃 노드, 가중치)}
- 각 노드 값의 최단 거리를 구하기
- 다익스트라 알고리즘 이용
- 거리가 k 이내인 노드의 개수를 return
✅ 구현
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import heapq
def solution(N, road, K):
distances= [float("inf")]*(N+1)
distances[1]= 0
heap= []
heapq.heappush(heap, (0, 1))
dic= {i: [] for i in range(1,N+1)}
for a,b, weight in road:
dic[a].append((b, weight))
dic[b].append((a, weight))
while heap:
distance, node= heapq.heappop(heap)
for ad_node, weight in dic[node]:
dist= distance+ weight
if dist < distances[ad_node]:
distances[ad_node]= dist
heapq.heappush(heap, (dist, ad_node))
return len([i for i in distances if i<=K])
✅ 회고
-
가중치를 가진 그래프에서 각 노드의 최단 거리를 알기 위해 사용할 수 있는 알고리즘은 문제 접근에서 명시하였듯이 여러 개가 있다. 따라서 여러 알고리즘 중 가중치는 자연수라는 제약 조건을 보고 다익스트라를 이용해 구현해야 겠다고 생각했다. 알고리즘을 구현하기 전 노드의 연결 정보를 가진 road 배열을 딕셔너리로 먼저 바꾸었더니 다익스트라를 구현하기 훨씬 수월해졌다.
This post is licensed under CC BY 4.0 by the author.