백준 10775 공항 java
2021. 2. 1. 16:33
문제 소개 www.acmicpc.net/problem/10775
내용
공항에는 G개의 게이트가 있으며 각각은 1에서 G까지의 번호를 가지고 있다.
공항에는 P개의 비행기가 순서대로 도착할 예정이며, 당신은 i번째 비행기를 1번부터 gi (1 ≤ gi ≤ G) 번째 게이트중 하나에 영구적으로 도킹하려 한다.
비행기가 어느 게이트에도 도킹할 수 없다면 공항이 폐쇄되고, 이후 어떤 비행기도 도착할 수 없다.
승원이는 비행기를 최대 몇 대 도킹시킬 수 있는가?
입력
첫 번째 줄에는 게이트의 수 G (1 ≤ G ≤ 105)가 주어진다.
두 번째 줄에는 비행기의 수 P (1 ≤ P ≤ 105)가 주어진다.
이후 P개의 줄에 gi (1 ≤ gi ≤ G) 가 주어진다.
출력
승원이가 도킹시킬 수 있는 최대의 비행기 수를 출력한다.
해결 방법
아이디어
그리디 알고리즘과 유니온파인드 알고리즘으로 해결가능하다.
gi에서 최선책은 gi의 값이 된다. gi에 도킹했다면 gi -1 이 차선책이 된다.
이렇게 도킹할때마다 해당 값의 차선책을 연결해주면 해결할 수 있다.
실제 풀이 코드
public class Main {
static int[] parent;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int gatewayCount = Integer.parseInt(br.readLine());
int plainCount = Integer.parseInt(br.readLine());
parent = new int[gatewayCount + 1];
for (int i = 1; i <= gatewayCount; i++) {
parent[i] = i;
}
int answer = 0;
for (int i = 0; i < plainCount; i++) {
int g = Integer.parseInt(br.readLine());
int emptyGate = getParents(g);
if (emptyGate == 0) {
break;
}
answer++;
union(emptyGate, emptyGate - 1);
}
System.out.println(answer);
}
public static int getParents(int x) {
if (x == parent[x]) return x;
return parent[x] = getParents(parent[x]);
}
public static void union(int x, int y) {
x = getParents(x);
y = getParents(y);
if (x != y) {
parent[x] = y;
}
}
}
결과
'알고리즘 문제 > 백준' 카테고리의 다른 글
백준 11437 LCA java (0) | 2021.02.05 |
---|---|
백준 10942 펠린드롬? java (0) | 2021.02.03 |
백준 9466 텀 프로젝트 java (0) | 2021.01.27 |
백준 9252 LCS 2 java (0) | 2021.01.25 |
백준 7453 합이 0인 네자리 수 java (0) | 2021.01.23 |