섬 연결하기


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

문제보기
Alt text

소스코드

import java.util.Arrays;
import java.util.Comparator;

class Solution {
    public int solution(int n, int[][] costs) {

        Arrays.sort(costs, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return Integer.compare(o1[2], o2[2]);
            }
        });

        return findBestBridge(n, costs);
    }

    private int findBestBridge(int n, int[][] costs) {
        int[] parent = new int[n];
        Arrays.setAll(parent, i -> i);

        int bridgCnt = 0;
        int totalCost = 0;

        for (int i = 0; i < costs.length; i++) {
            int island1 = costs[i][0];
            int island2 = costs[i][1];
            int cost = costs[i][2];

            int island1Parent = findParent(island1, parent);
            int island2Parent = findParent(island2, parent);

            if (island1Parent!=island2Parent) {
                parent[island2Parent] = island1Parent;
                totalCost += cost;
                bridgCnt++;
            }

            if (bridgCnt == n - 1) break;
        }

        return totalCost;
    }

    private static int findParent(int no, int[] parent) {
        if (parent[no] == no) {
            return no;
        }

        return parent[no] = findParent(parent[no], parent);
    }
}