10775번: 공항
예제 1 : [2][?][?][1] 형태로 도킹시킬 수 있다. 3번째 비행기는 도킹시킬 수 없다. 예제 2 : [1][2][3][?] 형태로 도킹 시킬 수 있고, 4번째 비행기는 절대 도킹 시킬 수 없어서 이후 추가적인 도킹은 불
www.acmicpc.net
문제
오늘은 신승원의 생일이다.
박승원은 생일을 맞아 신승원에게 인천국제공항을 선물로 줬다.
공항에는 G개의 게이트가 있으며 각각은 1에서 G까지의 번호를 가지고 있다.
공항에는 P개의 비행기가 순서대로 도착할 예정이며, 당신은 i번째 비행기를 1번부터 gi (1 ≤ gi ≤ G) 번째 게이트중 하나에 영구적으로 도킹하려 한다. 비행기가 어느 게이트에도 도킹할 수 없다면 공항이 폐쇄되고, 이후 어떤 비행기도 도착할 수 없다.
신승원은 가장 많은 비행기를 공항에 도킹시켜서 박승원을 행복하게 하고 싶어한다. 승원이는 비행기를 최대 몇 대 도킹시킬 수 있는가?
입력
첫 번째 줄에는 게이트의 수 G (1 ≤ G ≤ 105)가 주어진다.
두 번째 줄에는 비행기의 수 P (1 ≤ P ≤ 105)가 주어진다.
이후 P개의 줄에 gi (1 ≤ gi ≤ G) 가 주어진다.
출력
승원이가 도킹시킬 수 있는 최대의 비행기 수를 출력한다.
코드
import sys
input = sys.stdin.readline
g = int(input())
p = int(input())
parent = [i for i in range(g+1)]
def find(x):
if parent[x] != x:
parent[x] = find(parent[x])
return parent[x]
# 비행기는 입력으로 받은 수보다 같거나 작은 번호의 게이트에 도킹해야함
planes = []
for _ in range(p):
planes.append(int(input()))
ans = 0
for plane in planes:
docking_gate = find(plane)
if docking_gate == 0: # 도킹할 수 있는 gi보다 작거나 같은 번호의 게이트가 없음
break
parent[docking_gate] = parent[docking_gate-1]
ans += 1
print(ans)
문제의 풀이는 어렵지 않지만 처음에 문제를 이해가 안돼서 조금 오래 걸렸다.
비행기들은 순서대로 들어오고 각 비행기는 입력으로 주어진 수보다 같거나 작은 번호의 게이트에 도킹해야한다. 즉 i번째 입력으로 2가 들어왔다면 i번째 비행기는 2번 게이트나 1번 게이트에 도킹할 수 있다는 말이다. 그러므로 비행기들은 자신이 도킹할 수 있는 번호 중 최대한 큰 번호에 도킹해야만 한다.
'문제풀이 > 분리집합' 카테고리의 다른 글
[Python/파이썬] 백준 7511번 소셜 네트워킹 어플리케이션 (0) | 2023.05.20 |
---|---|
[Python/파이썬] 백준 17352번 여러분의 다리가 되어 드리겠습니다! (0) | 2023.05.19 |
[Python/파이썬] 백준 4195번 친구 네트워크 (0) | 2023.04.05 |
[Python/파이썬] 백준 18116번 로봇 조립 (0) | 2023.04.04 |
[Python/파이썬] 백준 16562번 친구비 (0) | 2023.04.04 |