알고리즘82 :: 프로그래머스_섬연결하기(MST, 크루스칼)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
import java.util.ArrayList;
import java.util.Collections;
class Solution {
static class MST implements Comparable<MST>{
int start;
int end;
int value;
MST(int start, int end, int value){
this.start = start;
this.end = end;
this.value = value;
}
@Override
public int compareTo(MST o) {
// TODO Auto-generated method stub
return this.value - o.value;
}
}
static int[] parents;
static ArrayList<MST> al = new ArrayList<>();
static int find(int n) {
if(parents[n] == n )
return n;
else
return parents[n] = find(parents[n]);
}
static void merge(int u, int v) {
int f_u = find(u);
int f_v = find(v);
if(f_u != f_v) {
parents[f_v] = f_u;
}
}
public int solution(int n, int[][] costs) {
int answer = 0;
parents = new int[n+1];
for(int i=1; i<=n; i++) {
parents[i] = i;
}//초기값을 주고
for(int i=0; i<costs.length; i++) {
al.add(new MST(costs[i][0],costs[i][1],costs[i][2]));
}//start, end, value 넘겨주고
int ans = 0;
Collections.sort(al);
for(int i=0; i<al.size(); i++) {
int u = al.get(i).start;
int v = al.get(i).end;
int value = al.get(i).value;
if(find(u)!=find(v)) {
merge(u,v);
ans += value;
}
}//end of for
return ans;
}
}
|
cs |
예전에 포스팅 할때는 사이클이 형성되는지 체크를 안했는데... 굉장히 오류가 아닌가 싶다.
MST 는 최소 스패닝 트리를 구성하고 그중에서 가중치의 합이 제일 작은것을 찾는 과정이다.
따라서, 단순 MST 구현, 크루스칼, 프림 알고리즘 활용하면 해결할 수 있는데 비교적 크루스칼이 쉽다.
'알고리즘' 카테고리의 다른 글
알고리즘84 :: 프로그래머스_단어변환 (0) | 2020.04.24 |
---|---|
알고리즘83 :: 프로그래머스_네트워크 (0) | 2020.04.24 |
알고리즘81 :: BOJ_18809_Gaaaaaaaaaarden(작성중) (0) | 2020.04.21 |
알고리즘80 :: 프로그래머스_베스트앨범 (0) | 2020.04.21 |
알고리즘79 :: BOJ_2503_숫자야구 (0) | 2020.04.11 |
댓글
이 글 공유하기
다른 글
-
알고리즘84 :: 프로그래머스_단어변환
알고리즘84 :: 프로그래머스_단어변환
2020.04.24 -
알고리즘83 :: 프로그래머스_네트워크
알고리즘83 :: 프로그래머스_네트워크
2020.04.24 -
알고리즘81 :: BOJ_18809_Gaaaaaaaaaarden(작성중)
알고리즘81 :: BOJ_18809_Gaaaaaaaaaarden(작성중)
2020.04.21 -
알고리즘80 :: 프로그래머스_베스트앨범
알고리즘80 :: 프로그래머스_베스트앨범
2020.04.21