ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [프로그래머스] 섬 연결하기
    ALGORITHM/PROGRAMMERS 2021. 8. 14. 21:15

    https://programmers.co.kr/learn/courses/30/lessons/42861#

     

    코딩테스트 연습 - 섬 연결하기

    4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4

    programmers.co.kr

    2021-08-14


    MST 알고리즘

     

    1. 크루스칼 알고리즘

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    import java.util.*;
    class Solution {
       static int[] parent;
        static int find(int x) {
            if(x == parent[x]) return x;
            return parent[x] = find(parent[x]);
        }
     
        static void union(int x, int y) { // y > x
            x = find(x);
            y = find(y);
     
            if(x != y) parent[y] = x;
        }
     
        static int solution(int n, int[][] costs) {
            int answer = 0;
            // 1) 간선 리스트의 가중치를 기준으로 오름차순 정렬
            Arrays.sort(costs, Comparator.comparingInt(o -> o[2]));
     
            // union-find (parent[] init)
            parent = new int[n];
            for(int i = 0; i < n; i++) parent[i] = i;
     
            // 2) 가중치가 작은 간선부터 선택
            for(int i = 0; i < costs.length; i++) {
                int start = costs[i][0];
                int end = costs[i][1];
                int weight = costs[i][2];
     
                // 3) 부모노드가 같지 않은 경우 연결
                if(find(start) != find(end)) {
                    if(start > end) {
                        int tmp = end;
                        end = start;
                        start = tmp;
                    }
                    union(start, end);
                    answer += weight;
                }
            }
     
            return answer;
        }
    }
    cs

    #문제풀이

    크루스칼 알고리즘

    union 따로 함수로 안 빼고, find에서 나온 값들을 바로 parent[end] = start 이런식으로 넣어도 된다.

     

     

     

    2. 프림 알고리즘

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    import java.util.*;
    class Solution {
     static class Edge {
            int target;
            int weight;
     
            public Edge(int target, int weight) {
                this.target = target;
                this.weight = weight;
            }
        }
        static int solution(int n, int[][] costs) {
           int answer = 0;
            // 가중치 오름차순 정렬
            PriorityQueue<Edge> pq = new PriorityQueue<>((o1, o2) -> o1.weight - o2.weight);
            List<List<Edge>> list = new ArrayList<>();
     
            // init
            for(int i = 0; i <= n; i++) list.add(new ArrayList<>());
     
            for(int i = 0; i < costs.length; i++) {
                list.get(costs[i][0]).add(new Edge(costs[i][1], costs[i][2]));
                list.get(costs[i][1]).add(new Edge(costs[i][0], costs[i][2]));
            }
     
            boolean[] vtd = new boolean[n];
     
            //임의의 정점 하나 선택
            pq.add(new Edge(0,0));
            
            while(!pq.isEmpty()) {
                Edge e = pq.poll();
                if(vtd[e.target]) continue;
                vtd[e.target] = true;
                answer += e.weight;
     
                for(Edge edge: list.get(e.target)) {
                    if(!vtd[edge.target]) pq.add(new Edge(edge.target, edge.weight));
                }
            }
     
            return answer;
        }
     
    }
    cs

    #문제풀이

    프림 알고리즘

     

    댓글

Programming Diary