1번 마을에 있는 음식점이 K 이하의 시간에 배달이 가능한 마을의 개수 구하기.
N | road | K | result |
---|---|---|---|
5 | [[1,2,1],[2,3,3],[5,2,2],[1,4,2],[5,3,1],[5,4,2]] | 3 | 4 |
6 | [[1,2,1],[1,3,2],[2,3,2],[3,4,3],[3,5,2],[3,5,3],[5,6,1]] | 4 | 4 |
한 지점에서 다른 모든 지점까지의 최단 경로를 구해 K이하인 것의 개수를 구한다.
: 한 지점에서 다른 모든 지점까지의 최단경로를 계산
단계마다 방문하지 않은 노드 중 가장 최단 거리가 짧은 노드를 선택한 후 그 노드를 거쳐가는 경우를 확인하여 최단거리를 갱신한다. -----> 우선순위 큐 사용
각각의 경우에 가장 짧은 것을 선택한다는 점에서 그리디 알고리즘, 해당 노드까지의 최단거리를 기록한다는 점에서 다이나믹 프로그래밍의 성격을 가짐.
import heapq
def dks(v, graph, dp):
q = []
# 현재 가장 가까운 노드를 저장하기 위한 목적으로 우선순위 큐 사용
heapq.heappush(q, (0, 1)) #cost, start
dp[1] = 0
while q:
# 현재 정점까지의 비용 : cost
w, n = heapq.heappop(q)
# 현재 정점까지의 비용 + 현재 정점에서 다음 정점까지의 비용 c = 다음 노드 까지의 비용
for ad_n, ad_w in graph[n]:
ww = w + ad_w
# 다음 노드까지의 비용이 기록된 값보다 작으면 조건 성립
if ww < dp[ad_n]:
dp[ad_n] = ww#업데이트
heapq.heappush(q, (ww, ad_n))
return dp
def solution(N, roads, K):
ans = 0
graph = [[] for _ in range(N+1)]
# 양방향
for start, end, time in roads:
graph[start].append((end, time))
graph[end].append((start, time))
# N번 노드까지 오는 비용
dp = [1e9]*(N+1)
result = dks(1, graph, dp)
for re in result:
if re <= K:
ans += 1
return ans
graph
연결 관계를 저장할 2차원 리스트인 graph에 노드와 걸리는 시간 순으로 저장한다. 이 때 양방향 도로이므로 양방향 관계로 저장한다.
dp
각 노드까지의 최단 거리를 저장할 dp테이블을 만들고 매우 큰 수인 1e9
로 초기화한다.
다익스트라 알고리즘
각 상황에서 길이가 최소인 노드를 찾기 위해 우선순위 큐 자료구조를 이용한다. heapq 모듈을 이용해 구현한다.