https://school.programmers.co.kr/learn/courses/30/lessons/42861
n개의 섬 사이에 다리를 건설하는 비용(costs)이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 return 하도록 solution을 완성하세요.
다리를 여러 번 건너더라도, 도달할 수만 있으면 통행 가능하다고 봅니다. 예를 들어 A 섬과 B 섬 사이에 다리가 있고, B 섬과 C 섬 사이에 다리가 있으면 A 섬과 C 섬은 서로 통행 가능합니다.
- 섬의 개수 n은 1 이상 100 이하입니다.
- costs의 길이는 ((n-1) * n) / 2이하입니다.
- 임의의 i에 대해, costs[i][0] 와 costs[i][1]에는 다리가 연결되는 두 섬의 번호가 들어있고, costs[i][2]에는 이 두 섬을 연결하는 다리를 건설할 때 드는 비용입니다.
- 같은 연결은 두 번 주어지지 않습니다. 또한 순서가 바뀌더라도 같은 연결로 봅니다. 즉 0과 1 사이를 연결하는 비용이 주어졌을 때, 1과 0의 비용이 주어지지 않습니다.
- 모든 섬 사이의 다리 건설 비용이 주어지지 않습니다. 이 경우, 두 섬 사이의 건설이 불가능한 것으로 봅니다.
- 연결할 수 없는 섬은 주어지지 않습니다.
import java.util.*;
class Solution {
static int[] parents;
public static int solution(int n, int[][] costs) {
parents = new int[n];
for(int node = 0; node < n; node++) parents[node] = node;
Arrays.sort(costs, new Comparator<int[]>() {
public int compare(int[] c1, int[] c2) {
return c1[2] - c2[2];
}
});
int idx = 0, minLen = 0;
for(int i = 0; i < n - 1; i++) {
int[] edge = costs[idx];
if(isSameParents(edge[0], edge[1])) {
i--;
idx++;
continue;
} else {
union(edge[0], edge[1]);
minLen += edge[2];
}
}
return minLen;
}
static int findParents(int node) {
if(parents[node] == node) return node;
return parents[node] = findParents(parents[node]);
}
static void union(int node1, int node2) {
int parent1 = findParents(node1), parent2 = findParents(node2);
if(parent1 != parent2) {
if(parent1 < parent2) parents[parent2] = parent1;
else parents[parent1] = parent2;
}
}
static boolean isSameParents(int node1, int node2) {
int parent1 = findParents(node1), parent2 = findParents(node2);
if(parent1 == parent2) return true;
return false;
}
}