코딩 공부/백준

[백준][C++] 10775 공항

김 정 환 2021. 4. 16. 17:53
반응형

www.acmicpc.net/problem/10775

 

10775번: 공항

예제 1 : [2][?][?][1] 형태로 도킹시킬 수 있다. 3번째 비행기는 도킹시킬 수 없다. 예제 2 : [1][2][3][?] 형태로 도킹 시킬 수 있고, 4번째 비행기는 절대 도킹 시킬 수 없어서 이후 추가적인 도킹은 불

www.acmicpc.net

 

 

 

알고리즘 종류

자료구조

분리집합(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 == 0break;
        
        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