풀이 시간 : 30분
정통 방식은 유니온-파인드를 이용한 크루스칼 알고리즘으로 풀어보는 것 같다.
유니온-파인드를 사용하게 되면, 사이클이 형성되는 것을 방지할 수 있다.
실제 계산을 해보면, 1 + 1 + 2 가 되어 answer=4가 되고, parent배열의 값은 모두 0으로 저장되어, 그래프가 최소로 연결되는 것을 확인할 수 있다.
import java.util.*;
class Solution {
static int[] parent;
public int solution(int n, int[][] costs) {
int answer = 0;
parent = new int[n];
for(int i=0; i<n; i++) {
parent[i] = i;
}
Arrays.sort(costs, (o1, o2) -> o1[2] - o2[2]);
// 크루스칼 알고리즘
for(int i=0; i<costs.length; i++) {
int a = find(costs[i][0]);
int b = find(costs[i][1]);
if(a != b) {
union(a,b);
answer += costs[i][2];
}
}
return answer;
}
static int find(int a) {
if(parent[a] == a) return a;
return parent[a] = find(parent[a]);
}
static void union(int a, int b) {
a = find(a);
b = find(b);
if (a != b) {
parent[b] = a;
}
}
}
내일은 dfs, 백트래킹 관련 문제를 풀어보고자 한다.