반응형
🗾 섬 연결하기
Minimum Spanning Tree (최소 신장 트리),
크루스칼(Kruskal) 알고리즘,
Union Find
이 문제를 해결하기 위해서는 위의 세 가지 개념이 필요하다.
Minimum Spanning Tree에 대한 개념은 여기에서,
크루스칼 알고리즘과 Union Find에 대한 개념은 여기에서 확인할 수 있다.
문제 설명
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의 비용이 주어지지 않습니다.
- 모든 섬 사이의 다리 건설 비용이 주어지지 않습니다. 이 경우, 두 섬 사이의 건설이 불가능한 것으로 봅니다.
- 연결할 수 없는 섬은 주어지지 않습니다.
입출력 예
n | costs | return |
4 | [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] | 4 |
💡 나의 풀이
import java.util.*;
class Solution {
static int[] parent;
public int solution(int n, int[][] costs) {
//크루스칼 알고리즘을 사용하기 위해 가중치 기준 오름차순 정렬
Arrays.sort(costs, (int[] c1, int[] c2) -> c1[2]-c2[2]);
//Union find를 사용하기 위해 parent 배열 선언
parent = new int[n];
for(int i=0; i<n; i++) {
parent[i] = i; //처음에는 자기 자신으로 부모를 초기화
}
int total = 0;
for(int[] edge: costs) {
int from = edge[0];
int to = edge[1];
int cost = edge[2];
int fromParent = findParent(from);
int toParent = findParent(to);
//부모노드가 같으면(두 노드가 같은 그래프에 속하면)
//해당 간선을 선택하지 않는다.
if(fromParent == toParent) continue;
total += cost;
parent[toParent] = fromParent; //간선을 연결해 두 노드가 같은 그래프에 속하게 되었으므로 부모 노드를 갱신
}
return total;
}
//부모노드가 자기자신과 같은 노드를 찾을 때 까지 재귀호출
private int findParent(int node) {
if(parent[node] == node) return node;
return parent[node] = findParent(parent[node]);
}
}`
코드에 대한 자세한 설명은 아래 두 링크에서 확인할 수 있다.
반응형
'Algorithm Test > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 단속카메라 (JAVA) (0) | 2021.04.30 |
---|---|
[프로그래머스] 정수 삼각형 (JAVA) (0) | 2021.04.30 |
[프로그래머스] [2020 KAKAO BLIND RECRUITMENT] 자물쇠와 열쇠 (JAVA) (0) | 2021.04.29 |
[프로그래머스] 단어 변환 (JAVA) (0) | 2021.04.01 |
[프로그래머스] [월간 코드 챌린지 시즌1] 풍선 터트리기 (JAVA) (0) | 2021.03.31 |