n개의 섬 사이에 다리를 건설하는 비용(costs)이 주어질 때, 최소의 비용으로 모든 섬이 서로 통행 가능하도록 만들 때 필요한 최소 비용을 return 하도록 solution을 완성하세요.
다리를 여러 번 건너더라도, 도달할 수만 있으면 통행 가능하다고 봅니다. 예를 들어 A 섬과 B 섬 사이에 다리가 있고, B 섬과 C 섬 사이에 다리가 있으면 A 섬과 C 섬은 서로 통행 가능합니다.
costs를 그림으로 표현하면 다음과 같으며, 이때 초록색 경로로 연결하는 것이 가장 적은 비용으로 모두를 통행할 수 있도록 만드는 방법입니다.
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; } }
인성씨 고생많으셨어요!