[BOJ 10775] 공항

2023. 4. 18. 16:34Baekjoon

728x90

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

 

10775번: 공항

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

www.acmicpc.net

 

- 문제 요약

 

공항에는 G개의 게이트가 있으며 각각은 1에서 G까지의 번호를 가지고 있다.

공항에는 P개의 비행기가 순서대로 도착할 예정이며, 당신은 i번째 비행기를 1번부터 gi (1 ≤ gi ≤ G) 번째 게이트 중 하나에 영구적으로 도킹하려 한다.

비행기가 어느 게이트에도 도킹할 수 없다면 공항이 폐쇄되고, 이후 어떤 비행기도 도착할 수 없다.

승원이는 비행기를 최대 몇 대 도킹시킬 수 있는가?

 

 

- 알고리즘 정리

 

Union-Find를 사용해서 풀었습니다.

현재 게이트가 도킹 가능한 게이트라면 바로 앞 게이트와 묶어줍니다.

도킹이 불가능한 게이트라면 현재까지 게이트에 도킹한 비행기의 수를 출력한 뒤 프로그램을 종료해 줍니다.

 

 

- 코드 작성

 

#include<bits/stdc++.h>
using namespace std;

#define MAX 100001
int g,p,parent[MAX],a,result;
vector<int>v;

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

void Union(int x,int y){
	int fx=Find(x);
	int fy=Find(y);
	if(fx!=fy){
		parent[fy]=fx;
	}
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);
	cin>>g>>p;
	for(int i=1;i<=g;i++){
		parent[i]=i;
	}
	for(int i=0;i<p;i++){
		cin>>a;
		v.push_back(a);
	}
	for(int i=0;i<p;i++){
		int f=Find(v[i]);
		if(f!=0){
			Union(f-1,f);
			result++;
		}
		else{
			break;
		}
	}
	cout<<result;
}

코드 제출 결과

728x90

'Baekjoon' 카테고리의 다른 글

[BOJ 5550] 헌책방  (0) 2023.04.20
[BOJ 13560] 축구 게임  (0) 2023.04.19
[BOJ 9177] 단어 섞기  (0) 2023.04.14
[BOJ 12781] PIZZA ALVOLOC  (0) 2023.04.14
[BOJ 18780] Timeline  (0) 2023.04.11