λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Algorithm πŸ§‘πŸ»‍πŸ’»/λ°±μ€€(BOJ)

[λ°±μ€€,c++] 10775번 - 곡항

by μ•ˆμ£Όν˜• 2022. 9. 2.

문제

 

10775번: 곡항

예제 1 : [2][?][?][1] ν˜•νƒœλ‘œ λ„ν‚Ήμ‹œν‚¬ 수 μžˆλ‹€. 3번째 λΉ„ν–‰κΈ°λŠ” λ„ν‚Ήμ‹œν‚¬ 수 μ—†λ‹€. 예제 2 : [1][2][3][?] ν˜•νƒœλ‘œ 도킹 μ‹œν‚¬ 수 있고, 4번째 λΉ„ν–‰κΈ°λŠ” μ ˆλŒ€ 도킹 μ‹œν‚¬ 수 μ—†μ–΄μ„œ 이후 좔가적인 도킹은 뢈

www.acmicpc.net

 

μ½”λ“œ

#include <iostream>
using namespace std;


int parent[100001];
int G, P, ans;


int find(int x){
    if(x == parent[x]) return x;
    else return parent[x] = find(parent[x]);
}

void union_parent(int a, int b){
    a = find(a);
    b = find(b);
    parent[a] = b;
}

int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    for(int i=0; i<=100000; i++) parent[i] = i;
    
    cin>>G>>P;
    for(int i=1; i<=G; i++){
        int gate; cin>>gate;
        
        if(find(gate) == 0) break;
        else{
            ans++;
            union_parent(find(gate), find(gate)-1);
        }
    }
    cout<<ans;
}

 

풀이

μ²˜μŒμ— 문제 이해가 잘 μ•ˆ κ°”μŠ΅λ‹ˆλ‹€.

κ³΅ν•­μ—λŠ” P개의 λΉ„ν–‰κΈ°κ°€ μˆœμ„œλŒ€λ‘œ 도착할 μ˜ˆμ •μ΄λ©°, 당신은 i번째 λΉ„ν–‰κΈ°λ₯Ό 1λ²ˆλΆ€ν„° gi (1 ≤ gi ≤ G) 번째 게이트 쀑 ν•˜λ‚˜μ— 영ꡬ적으둜 λ„ν‚Ήν•˜λ € ν•œλ‹€. λΉ„ν–‰κΈ°κ°€ μ–΄λŠ κ²Œμ΄νŠΈμ—λ„ 도킹할 수 μ—†λ‹€λ©΄ 곡항이 νμ‡„λ˜κ³ , 이후 μ–΄λ–€ 비행기도 도착할 수 μ—†λ‹€.

이 말은 gκ°€ 3이라면 λΉ„ν–‰κΈ°κ°€ 1, 2, 3 쀑 ν•œ ꡰ데 도킹할 수 있고, λ§Œμ•½ 도킹 κ°€λŠ₯ν•œ κ³³ μ „λΆ€κ°€ 이미 λΉ„ν–‰κΈ°λ‘œ 꽉 μ°¨μžˆλ‹€λ©΄ 더 이상 아무 비행기도 λ„ν‚Ήν•˜μ§€ λͺ»ν•˜κ³  곡항을 νμ‡„ν•œλ‹€λŠ” λ§μž…λ‹ˆλ‹€.

풀이 같은 κ²½μš°λ„ λ‹€λ₯Έ λΈ”λ‘œκ·Έμ˜ 풀이λ₯Ό 보고 ν•΄κ²°ν–ˆλŠ”λ° ꡉμž₯히 λ…νŠΉν•œ ν’€μ΄μ˜€μŠ΅λ‹ˆλ‹€.

도킹할 λ•Œ g번의 λ…Έλ“œμ™€ g-1 λ…Έλ“œλ₯Ό ν•©μΉ˜λŠ” 아이디어인데, ν•΄κ²° 방법은 g번 κ²Œμ΄νŠΈλΆ€ν„° μ°¨λ‘€λŒ€λ‘œ λ„ν‚Ήμ‹œν‚€λŠ” κ²ƒμž…λ‹ˆλ‹€. g번이 차있으면 g-1, g-2, ... ,1λ²ˆκΉŒμ§€ λ„ν‚Ήν•œ ν›„ 1λ²ˆλ„ 차있으면 μ’…λ£Œν•©λ‹ˆλ‹€.

λ§Œμ•½ g번의 λ…Έλ“œκ°€ 0이 μ•„λ‹ˆλΌλ©΄ 도킹할 수 μžˆλ‹€λŠ” κ²Œμ΄νŠΈκ°€ 적어도 ν•œ κ°œλŠ” λ‚¨μ•˜λ‹€λŠ” μ˜λ―Έκ°€ λ˜μ–΄ λ„ν‚Ήμ‹œν‚€κ³ , 0이면 μ’…λ£Œν•˜λŠ” ν’€μ΄μž…λ‹ˆλ‹€.

μ˜ˆμ‹œλ₯Ό λ“€λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.


4
6
2
2
3
3
4
4

μœ„μ™€ 같은 μž…λ ₯μ—μ„œ μ € 처음 μ΄ˆκΈ°κ°’μ„ μ„ΈνŒ…ν•˜κ³  λ‚˜λ©΄ parent 배열은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • parent[1] = 1, parent[2] = 2, parent[3] = 3, parent[4] = 4, parent[5] = 5, parent[6] = 6

이제 g μž…λ ₯ μˆœμ„œλŒ€λ‘œ μ‚΄νŽ΄λ³΄λ©΄ 저처음 gκ°€ 2일 경우 union_parent(2, 1)을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. μˆ˜ν–‰ν•˜κ²Œ 되면 parent[2] = 1이 λ©λ‹ˆλ‹€.

  • parent[1] = 1, parent[2] = 1, parent[3] = 3, parent[4] = 4, parent[5] = 5, parent[6] = 6

λ‹€μŒ μž…λ ₯도 gκ°€ 2κ°€ λ“€μ–΄μ˜€κ²Œ λ©λ‹ˆλ‹€. union_parent(1, 0)을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. μˆ˜ν–‰ν•˜κ²Œλ˜λ©΄ parent[1] = 0이 λ©λ‹ˆλ‹€.

  • parent[1] = 0, parent[2] = 1, parent[3] = 3, parent[4] = 4, parent[5] = 5, parent[6] = 6

λ‹€μŒμ€ gκ°€ 3이 λ“€μ–΄μ˜€κ²Œ λ©λ‹ˆλ‹€. union_parent(3, 2)을 μˆ˜ν–‰ν•©λ‹ˆλ‹€. μˆ˜ν–‰ν•˜κ²Œλ˜λ©΄ parent[3] = 2κ°€ λ©λ‹ˆλ‹€.

  • parent[1] = 0, parent[2] = 1, parent[3] = 2, parent[4] = 4, parent[5] = 5, parent[6] = 6

λ‹€μŒλ„ gκ°€ 3이 λ“€μ–΄μ˜€κ²Œ λ©λ‹ˆλ‹€. find(3) = 0이 λ©λ‹ˆλ‹€. λ”°λΌμ„œ μ’…λ£Œν•©λ‹ˆλ‹€.

λŒ“κΈ€