섬 연결하기

태그: , ,

카테고리: ,


출처 프로그래머스 - 섬 연결하기

사용 언어 자바

입력

  • 브릿지

최소신장트리를 구현하시오

풀이과정

문제가 너무 직설적이어서 별 생각없이 바로 풀었다 프림 알고리즘을 이용했다

제출 답안

public int solution(int n, int[][] costs) {
    int answer = 0;
    List<int[]> bridgeList = new ArrayList<>();
    List<Integer> connected = new ArrayList<>();

    int firstIsland = 0;
    connected.add(firstIsland);
    for (int[] i : costs) {
        if (i[0] == firstIsland || i[1] == firstIsland) bridgeList.add(i);
    }

    while (connected.size() < n) {
        // sort bridgeList by lowest cost
        Collections.sort(bridgeList, (a, b) -> a[2] - b[2]);

        // pop the lowest cost bridge from bridgeList
        int[] temp = bridgeList.remove(0);

        // islands in temp are all already connected
        if (connected.contains(temp[0]) && connected.contains(temp[1])) continue;

        // take the temp bridge
        int newIsland = -1;
        if (connected.contains(temp[0])) {
            newIsland = temp[1];
        }
        if (connected.contains(temp[1])) {
            newIsland = temp[0];
        }

        // pay the temp bridge's cost
        answer += temp[2];
        connected.add(newIsland);

        for (int[] i : costs) {
            // put all reachable bridges in bridgeList
            if (!bridgeList.contains(i) && (connected.contains(i[0]) && !connected.contains(i[1]) ||
                    connected.contains(i[1]) && !connected.contains(i[0]))) {
                bridgeList.add(i);
            }
        }
    }

    return answer;
}

댓글남기기