코딩테스트 연습/Baekjoon

[Baekjoon] 백준 10775번: 공항 (c++)

수기 2022. 5. 3. 23:24

https://www.acmicpc.net/problem/10775

 

10775번: 공항

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

www.acmicpc.net

 

Union Find문제에 익숙해져서 그런지 솔루션을 찾으면 푸는데 크게 어려움은 없었다.

다만 문제 이해가 오래 걸릴뿐...

내가 푼 방법은 이렇다

게이트들을 모두 노드라고 생각하고,

1. 입력 g에 대하여 루트노드를 찾는다. Find(g)

2. 루트 노드 g_parent에 대하여, g_parent의 차선책을 g_parent-1로 지정한다. Union(g_parent, g_parent-1)

      2.1  a, b로 주어진 노드들에 대하여 각각의 루트노드를 찾아 지정해준다. parent[a] = b

      2.2  Union이 한번 이루어지면 비행기가 정상적으로 도킹되었다는 의미이므로 cnt++을 해준다.

3. 만약 g_parent가 0이라면 for문을 중지하고, 현재 cnt를 출력한다.

 

 


코드(c++)

#include <string>
#include <vector>
#include <iostream>
using namespace std;
#define MAX 100001

int cnt=0;
int parent[MAX] = {0,};
int Find(int x){
    if(x == parent[x]) return x;
    
    int p = Find(parent[x]);
    parent[x] = p;
    return p;
    
}
void Union(int a,int b){
    a = Find(a); //또 2가들어오면 2의 부모를 찾아 (1)
    b = Find(b);
    
    parent[a] = b;
    cnt++;
}
int main(){
    ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
   
    int G, P, g;
    
    cin >> G >> P;
    for(int i=1;i<=G;i++)parent[i] = i;
    for(int i=0;i<P;i++){
        cin >> g;

        int g_parent = Find(g);
        if(g_parent == 0)break;
        Union(g_parent, g_parent-1);
    }
    
    cout << cnt;
    
    return 0;
}