백준 10775번 공항 문제 풀이

정상헌·2024년 2월 29일

코딩테스트연습

목록 보기
5/13
post-thumbnail

문제 링크 : https://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) 가 주어진다.
  • 출력 조건
    • 승원이가 도킹시킬 수 있는 최대의 비행기 수를 출력한다.

문제 풀이

이 문제는 Union-Find 알고리즘을 사용해서 풀 수 있다. 탑승구의 정보를 담는 parent 배열을 선언한다. 새로운 비행기가 탑승구에 도킹이 된다고 하면, 해당 탑승구 집합을 왼쪽 탑승구의 집합과 합친다. 단 집합의 루트가 0이면 더 이상 도킹이 불가능하다는 뜻이므로, 운영을 중단한다.

입출력 예시

입력 예시 1

4
3
4
1
1

출력 예시 1

2

입력 예시 2

4
6
2
2
3
3
4
4

출력 예시 2

3

CODE

import sys
input = sys.stdin.readline

def find_parent(parent, x):
    if x != parent[x]:
        parent[x] = find_parent(parent, parent[x])
    return parent[x]

def union_parent(parent, a, b):
    a = find_parent(parent, a)
    b = find_parent(parent, b)
    if a < b:
        parent[b] = a
    else:
        parent[a] = b

if __name__ == "__main__":
    # 입력
    N = int(input()) # 탑승구 수
    M = int(input()) # 비행기 수
    
    # Union-Find 알고리즘을 이용해 해결
    parent = [i for i in range(N+1)]
    
    answer = 0
    for i in range(M):
        # g_i 입력 - i번째 비행기의 탑승구 정보
        x = int(input())
        if find_parent(parent, x) == 0: # 비행기 도킹 불가능
            break
        else:
            parent_x = parent[x]
            union_parent(parent, parent_x, parent_x - 1) # 비행기 도킹
            answer += 1
    print(answer)

시간 복잡도

parent 배열을 초기화 : O(N)O(N)

비행기 도킹 시도 : O(M)O(M)

O(N+M)O(N+M)
profile
도봉구왕감자

0개의 댓글