n개의 섬 사이에 다리를 건설하는 비용(costs)이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 return 하도록 solution을 완성하세요.
다리를 여러 번 건너더라도, 도달할 수만 있으면 통행 가능하다고 봅니다. 예를 들어 A 섬과 B 섬 사이에 다리가 있고, B 섬과 C 섬 사이에 다리가 있으면 A 섬과 C 섬은 서로 통행 가능합니다.
n costs return
4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4
Code_1 - 실행 에러
import heapq def solution(n, costs): answer = 0 INF = int(1e9) graph = [[] for _ in range(n)] distance = [INF]*n for c in costs: node, target, cost = c graph[node].append((target, cost)) def dijkstra(start): q = [] heapq.heappush(q, (0, start)) distance[start] = 0 while q: cost, node = heapq.heappop(q) if distance[node] < cost: continue for next_g in graph[node]: next_cost = next_g[1] + cost if next_cost < distance[next_g[0]]: distance[next_g[0]] = next_cost heapq.heappush(q, (next_cost, next_g[0])) dijkstra(0) print(distance) return answer
- 다익스트라 알고리즘으로 구현하려고 노력했지만 답이 안 나올것 같아서 결국 구글링으로 힌트를 얻음...
Code_2 - 성공
def solution(n, costs): answer = 0 costs.sort(key=lambda x: x[2]) connect = set([costs[0][0]]) # 시작 연결점 while len(connect) != n: for cost in costs: # print(cost[0], cost[1], connect, answer) if cost[0] in connect and cost[1] in connect: continue if cost[0] in connect or cost[1] in connect: connect.update([cost[0], cost[1]]) answer += cost[2] break return answer
- 건설 비용을 기준으로 오름차순 정렬하여 비용이 가장 낮은 조건들을 먼저 연산함
- set안에 모든 위치가 연결될 때까지 반복문을 수행하며 두섬이 이미 연결된 경우 무시하고 연결되지 않은 경우 비용을 더함
- set.update()를 통해 중복을 제거함