반응형
알고리즘 종류
자료구조
분리집합(Union-Find)
사고 과정
무식하게 하게 2중 for문으로 하면 시간복잡도가 N^2이 나온다. 따라서 다른 방법을 사용해야 한다.
gi가 주어지면 gi부터 넣는 것이 빠르게 처리된다. 그리고 이후 -1씩 감소하면서 빈 곳을 찾으면 된다. 그렇다면, gi를 기준으로 왼쪽에 빈 곳이 있는 지 한 번에 알 수 있을까? 분리 집합을 이용하면 된다.
위 이미지를 보면, 5와 6은 2를 부모로 가리키고 있다. 4와 7 그리고 3은 0을 부모로 가리키고 있다. 이를 배열로 표현하면 아래와 같다.
구현(C++)
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
|
#include <iostream>
#include <vector>
using namespace std;
int n, p;
int ans = 0;
vector<int> parents;
int get_parent(int a){
if(parents[a] == a) return a;
return parents[a] = get_parent(parents[a]);
}
int main(void){
ios_base::sync_with_stdio(0);
cin.tie(0);
cin >> n >> p;
parents.resize(n+1);
for(int i=0; i<=n; i++) parents[i] = i;
int num;
for(int i=0; i<p; i++){
cin >> num;
int parent = get_parent(num);
if(parent == 0) break;
parents[parent] = parent - 1;
++ ans;
}
cout << ans << endl;
}
|
cs |
시행착오
반응형
'코딩 공부 > 백준' 카테고리의 다른 글
[백준][C++] 1162 도로포장 (0) | 2021.04.17 |
---|---|
[백준][C++] 4195 친구 네트워크 (0) | 2021.04.16 |
[백준][C++] 2170 선 긋기 (0) | 2021.04.16 |
[백준][C++] 16198 에너지 모으기 (0) | 2021.04.15 |
[백준][C++] 4179 불! (0) | 2021.04.15 |