문제설명
n개의 섬 사이에 다리를 건설하는 비용(costs)이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 return 하도록 solution을 완성하세요.
다리를 여러 번 건너더라도, 도달할 수만 있으면 통행 가능하다고 봅니다. 예를 들어 A 섬과 B 섬 사이에 다리가 있고, B 섬과 C 섬 사이에 다리가 있으면 A 섬과 C 섬은 서로 통행 가능합니다.
제한사항
이 문제는 섬을 모두 방문할 수 있도록 최소의 비용으로 섬 사이의 다리를 건설하는 그리디 문제 입니다.
그리디(Greedy): 현재 상황에서 가장 좋아보이는 것만을 선택하는 알고리즘
prim 알고리즘과 우선순위 큐를 사용했습니다.
우선순위 큐(Priority queue): 들어간 순서에 상관없이 우선순위가 높은 데이터가 먼저 나오는 형태의 자료구조
prim 알고리즘은 각 단계마다 현재 연결된 노드들 중 최소 비용의 간선을 선택하면서 MST를 구성해 나가는 반면, kruskal 알고리즘은 모든 간선을 비용에 따라 오름차순 정렬한 뒤, 사이클을 형성하지 않는 간선을 선택하면서 MST를 구성합니다.
이 때문에 간선의 개수가 많은 경우를 생각해 prim 알고리즘이 효율적이라고 판단했습니다.
import heapq
def solution(n, costs):
graph = [[] for _ in range(n)]
for cost in costs:
graph[cost[0]].append((cost[1], cost[2]))
graph[cost[1]].append((cost[0], cost[2]))
start = 0
visited = [False] * len(graph)
visited[start] = True
heap = []
result = 0
for node, weight in graph[start]:
heapq.heappush(heap, (weight, start, node))
while heap:
weight, start, node = heapq.heappop(heap)
if visited[node]:
continue
visited[node] = True
result += weight
for next_node, next_weight in graph[node]:
heapq.heappush(heap, (next_weight, node, next_node))
return result
위 코드의 시간 복잡도는 O(ElogV) 입니다.