> 문제
문제 : [섬 연결하기]
> 문제풀이
Kruskal로 풀이 하였다.
간선들의 가중치를 오름차순으로 정렬하는데 우선순위큐(PriorityQueue)를 사용하였다.
Union-find 메소드를 구현하여, 부모값이 다르면 연결(union)해주고, 가중치를 더해갔다.
import java.util.*;
class Solution {
static class Conn implements Comparable<Conn> {
int a,b,v;
public Conn(int a, int b, int v){
this.a = a;
this.b = b;
this.v = v;
}
@Override
public int compareTo(Conn o){
return this.v - o.v;
}
}
public int solution(int n, int[][] costs){
memo = new int[n];
Queue<Conn> pq = new PriorityQueue<>();
for(int i=0; i<n; i++){
memo[i] = i;
}
for(int i=0; i<costs.length; i++){
pq.add(new Conn(costs[i][0],costs[i][1],costs[i][2]));
}
int res = 0;
while(!pq.isEmpty()){
Conn c = pq.poll();
if(union(c.a, c.b)) res+=c.v;
}
return res;
}
static int[] memo;
static int find(int x){
if(memo[x] == x) return x;
memo[x] = find(memo[x]);
return memo[x];
}
static boolean union(int a, int b){
a = find(a);
b = find(b);
if(a != b){
memo[b] = a;
return true;
}else return false;
}
}
문제 출처 : Programmers
PREVIOUS[프로그래머스] Level4 - 호텔 방 배정