프로그래머스 섬 연결하기 (Java)

배인성·2022년 1월 28일
0

프로그래머스

목록 보기
24/55
post-thumbnail

링크

문제 링크

문제 설명

n개의 섬 사이에 다리를 건설하는 비용(costs)이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 return 하도록 solution을 완성하세요.

다리를 여러 번 건너더라도, 도달할 수만 있으면 통행 가능하다고 봅니다. 예를 들어 A 섬과 B 섬 사이에 다리가 있고, B 섬과 C 섬 사이에 다리가 있으면 A 섬과 C 섬은 서로 통행 가능합니다.

제한사항

  • 섬의 개수 n은 1 이상 100 이하입니다.
  • costs의 길이는 ((n-1) * n) / 2이하입니다.
  • 임의의 i에 대해, costs[i][0] 와 costs[i][1]에는 다리가 연결되는 두 섬의 번호가 들어있고, costs[i][2]에는 이 두 섬을 연결하는 다리를 건설할 때 드는 비용입니다.
  • 같은 연결은 두 번 주어지지 않습니다. 또한 순서가 바뀌더라도 같은 연결로 봅니다. 즉 0과 1 사이를 연결하는 비용이 주어졌을 때, 1과 0의 비용이 주어지지 않습니다.
  • 모든 섬 사이의 다리 건설 비용이 주어지지 않습니다. 이 경우, 두 섬 사이의 건설이 불가능한 것으로 봅니다.
  • 연결할 수 없는 섬은 주어지지 않습니다.

입출력 예

입출력 예 설명

costs를 그림으로 표현하면 다음과 같으며, 이때 초록색 경로로 연결하는 것이 가장 적은 비용으로 모두를 통행할 수 있도록 만드는 방법입니다.

풀이

  1. 비용이 낮은 순으로 2차원 배열을 오름차순 정렬한다
  2. 다리를 연결했을 때 Cycle이 발생하지 않는다면 둘을 이어준다.
  3. 이어주고나서는 항상 해당 노드의 부모를 바꿔줘야함 (Union_find)!

Union_find의 기초문제라고 할 수 있다.

어제 오늘은 이따가 코오롱베니트 코딩테스트가 있어서 프로그래머스 Level1, Level2 문제들 막 푸는중이다..

시간제한안에 문제를 풀어내야하는 코딩테스트.. ㅠㅠ 여태껏 코딩테스트는 한 번도 통과해본 적이 없다.. 몇 번 안해보긴 했지만 그냥 시간제한 안에 풀어내야하는게 정말 어렵다,, 그것도 모든 테스트케이스를 맞춰서 ㅜㅜ

힘내자~

코드

import java.util.*;
class Solution {
    public int[] parent;
    public int get_parent(int a) {
        if(a == parent[a])
            return parent[a];
        else
            return parent[a] = get_parent(parent[a]);
    }
    public void union(int a, int b) {
        a = get_parent(a);
        b = get_parent(b);
        if(a > b)
            parent[a] = b;
        else
            parent[b] = a;
    }
    public int solution(int n, int[][] costs) {
        int answer = 0, i, j;
        parent = new int[n];
        for(i = 0; i < parent.length; parent[i] = i++);
        Arrays.sort(costs, new Comparator<>(){
            @Override
            public int compare(int[] a, int[] b) {
                if(a[2] > b[2])
                    return 1;
                else
                    return -1;
            }
        });
        for(i = 0; i < costs.length; i++) {
            if(get_parent(costs[i][0]) == get_parent(costs[i][1]))
                continue;
            union(costs[i][0], costs[i][1]);
            answer += costs[i][2];
        }
        return answer;
    }
}
profile
부지런히 살자!!

2개의 댓글

comment-user-thumbnail
2022년 1월 28일

인성씨 고생많으셨어요!

1개의 답글