[프로그래머스] Level3 - 섬 연결하기

 
by 박신종

> 문제

문제 : [섬 연결하기]



> 문제풀이

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