# 공항
def find_parent(x):
if x != parent[x]:
parent[x] = find_parent(parent[x])
return parent[x]
def union_parent(x, y):
x = find_parent(x)
y = find_parent(y)
if x < y:
parent[y] = x
else:
parent[x] = y
G = int(input())
P = int(input())
parent = [i for i in range(G+1)]
plane = []
for _ in range(P):
plane.append(int(input()))
count = 0
for p in plane:
x = find_parent(p)
if x == 0:
break
union_parent(x, x-1)
count += 1
print(count)
그리디, Union-Find
1. 비행기가 도착하는 순서를 plane리스트에 기록
2. plane리스트를 앞에서부터 차례대로
- 해당 비행기의 부모(도킹할 게이트)를 찾는다 : find_parent
- 부모(도킹할 게이트)가 0 이면, 이후의 비행기 또한 모두 도킹할 수 없음 break
- 0이 아니면, 이전게이트와 도킹할 게이트를 연결 : union_parent
3. union_parent를 한 횟수 출력
union_parent를 적용할 때 약간의 어려움이 있었다.
union-find를 이용해서 게이트가 현재 도킹 되어 있는지를 관리한다.
n번 비행기는 1~n번 게이트에 도킹할 수 있으므로 n번 게이트먼저 도킹 한다. (그리디)
x와 x-1을 해주는 이유는 그리디 알골리즘을 적용하기 위함이다.
find_parent를 해서 나온 결과값은 현재 사용할 수 있는 게이트와 같다.
'Algorithm > BOJ' 카테고리의 다른 글
[백준] 4179번 - 불! (파이썬) (0) | 2022.03.03 |
---|---|
[백준] 2075번 - N번째 큰 수 ( 파이썬) (0) | 2022.03.02 |
[백준] 17472번 - 다리 만들기 2 (파이썬) (0) | 2022.02.19 |
[백준] 1613번 - 역사 (파이썬) (0) | 2022.02.19 |
[백준] 10159번 - 저울 (파이썬) (0) | 2022.02.19 |