n개의 섬 사이에 다리를 건설하는 비용(costs)이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 return 하도록 solution을 완성하세요.
다리를 여러 번 건너더라도, 도달할 수만 있으면 통행 가능하다고 봅니다. 예를 들어 A 섬과 B 섬 사이에 다리가 있고, B 섬과 C 섬 사이에 다리가 있으면 A 섬과 C 섬은 서로 통행 가능합니다.
섬의 개수가 7개이고, 배열이 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 인 경우 출력은 4가 되어야 함
function solution(n, costs) {
// 각 간선을 가중치 순서대로 정렬해줌
const roadMap = costs.sort((a, b) => a[2] - b[2]);
// 자신의 부모 노드를 표시해주는 배열을 생성, 이 때 초기값은 자기자신으로 설정
const connected = [];
for (let i = 0; i < n; i++) connected.push(i);
let answer = 0;
// 가중치가 작은값부터 순회를 진행
for (let i = 0; i < roadMap.length; i++) {
const [start, end, length] = roadMap[i];
const parentStart = getParent(connected, start);
const parentEnd = getParent(connected, end);
// 간선에 붙은 정점의 조상 노드를 확인해 같으면(=이미 연결되어있으면) 생략
if (parentStart === parentEnd) continue;
// 두 신장 트리를 하나의 신장 트리로 합치는 과정
// 이 때 방향의 일관성을 위해 조상노드의 값을 비교해 조상노드값이 작은쪽이 부모가 되도록 트리를 붙여줌
if (parentStart < parentEnd) connected[parentEnd] = start;
else connected[parentStart] = end;
// 가중치값 더해주기
answer += length;
}
return answer;
}
// 조상 노드를 확인하는 함수
// 부모 노드를 거슬러 올라가 parent를 반환함
function getParent(array, n) {
if (array[n] === n) return n;
else return getParent(array, array[n]);
}