https://school.programmers.co.kr/learn/courses/30/lessons/118669
다익스트라 알고리즘 활용 (참고 링크)힙(heap)을 사용하면 가중치가 가장 작은, 방문하지 않은 다음 노드를 쉽게 구할 수 있다.원소 in list vs 원소 in set 비교원소 in listO(n)원소 in setO(1) 이다.O(n)일 수도 있으나, 일반적으로는 O(1) 으로 생각하면 될 듯.list 보다는 set이 효율적python
from heapq import heappop, heappush
INF = 1e9
def solution(n, paths, gates, summits):
graph = [[] for _ in range(n + 1)]
summits_set = set(summits)
for i, j, w in paths:
graph[i].append([j, w])
graph[j].append([i, w])
heap_queue = [] # (intensity, node)
distance = [INF] * (n + 1)
# 모든 출발지를 우선순위 큐에 삽입
for gate in gates:
heappush(heap_queue, (0, gate))
distance[gate] = 0
while heap_queue:
intensity, node = heappop(heap_queue)
# 산봉우리이거나 intensity가 더 크다면 이동하지 않음
if node in summits_set or distance[node] < intensity:
continue
# 해당 노드에서 이동할 수 있는 곳으로 이동
for next_node, weight in graph[node]:
new_intensity = max(intensity, weight)
if distance[next_node] > new_intensity:
distance[next_node] = new_intensity
heappush(heap_queue, (new_intensity, next_node))
min_node = 0
min_intensity = INF
summits.sort()
for summit in summits:
if distance[summit] < min_intensity:
min_node = summit
min_intensity = distance[summit]
return [min_node, min_intensity]
if __name__ == "__main__":
result = solution(
n=7,
paths=[[1, 2, 5], [1, 4, 1], [2, 3, 1], [2, 6, 7], [4, 5, 1], [5, 6, 1], [6, 7, 1]] ,
gates=[3, 7],
summits=[1, 5]
)
print(result)
[5, 1]