백준 10775 - 공항
Updated:
Java
10775 번 - 공항
문제
공항에는 G개의 게이트가 있으며 각각은 1에서 G까지의 번호를 가지고 있다.
공항에는 P개의 비행기가 순서대로 도착할 예정이며, 당신은 i번째 비행기를 1번부터 gi (1 ≤ gi ≤ G) 번째 게이트중 하나에 영구적으로 도킹하려 한다. 비행기가 어느 게이트에도 도킹할 수 없다면 공항이 폐쇄되고, 이후 어떤 비행기도 도착할 수 없다.
신승원은 가장 많은 비행기를 공항에 도킹시켜서 박승원을 행복하게 하고 싶어한다. 승원이는 비행기를 최대 몇 대 도킹시킬 수 있는가?
접근 방법
코드
import java.util.*;
import java.io.*;
public class Main {
static int G,P, result;
static int[] parent;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stk;
G = stoi(br.readLine());
P = stoi(br.readLine());
parent = new int[G + 1];
int curG;
init();
for(int i = 0; i < P; i++) {
curG = stoi(br.readLine());
// 만약 넣으려는 게이트가 이미 꽉차있으면
if(findSet(curG) == 0)
break;
// 현재 게이트와 이전 게이트와 유니온
union(curG, findSet(curG) - 1);
result++;
}
System.out.println(result);
br.close();
}
// --------- Disjoint Set 시작 ------------
static void init() {
for(int i = 1; i <= G; i++) {
parent[i] = i;
}
}
static int findSet(int num) {
if(parent[num] == num)
return num;
return parent[num] = findSet(parent[num]);
}
static boolean union(int a, int b) {
int aRoot = findSet(a);
int bRoot = findSet(b);
if(aRoot == bRoot)
return false;
int min = Math.min(aRoot, bRoot);
parent[aRoot] = min;
parent[bRoot] = min;
return true;
}
// --------- Disjoint Set 끝 ------------
static int stoi(String str) {
return Integer.parseInt(str);
}
}
총평
후기
개선할 점
없습니다.