출처: 프로그래머스 코딩테스트 섬 연결하기 (Greedy) 5번째 문제
(https://programmers.co.kr/learn/courses/30/lessons/42861)
n개의 섬 사이에 다리를 건설하는 비용(costs)이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 return 하도록 solution을 완성하세요.
다리를 여러 번 건너더라도, 도달할 수만 있으면 통행 가능하다고 봅니다. 예를 들어 A 섬과 B 섬 사이에 다리가 있고, B 섬과 C 섬 사이에 다리가 있으면 A 섬과 C 섬은 서로 통행 가능합니다.
function solution(n, costs) {
if (n === 1) return 0
let answer = 0
const union = new Array(n).fill().map((el, idx) => idx)
costs = costs.sort((a, b) => a[2] - b[2])
for (let i = 0, cnt = 0; cnt < n - 1; i++) {
if (!connect(union, costs[i])) continue
answer += costs[i][2]
cnt++
}
return answer
}
function connect(union, cost) {
const parentA = findParent(union, cost[0])
const parentB = findParent(union, cost[1])
if (parentA === parentB) {
return false
}
if (parentA > parentB) {
union[parentA] = parentB
} else {
union[parentB] = parentA
}
return true
}
function findParent(union, idx) {
const hasParent = union[idx] !== idx
if (hasParent) {
union[idx] = findParent(union, union[idx])
}
return union[idx]
}
개인적으로 학부생때 다익스트라 알고리즘을 배울 때는 뭔가 감이 안왔는데 요번 문제를 통해서 확실하게 어떤 느낌인지 깨닫게 되었다. 좋은 예제인 것 같아 남에게 추천해줘도 될 것 같다.