[Python - Data Structure, Union Find] 10775 공항

2022. 9. 18. 14:45· Algorithm/Data Structure
목차
  1. 👨‍🏫 접근
  2. 👨‍🏫 문제 풀이
  3. 📄 전체 코드
  4. 📄 준비
  5. 📄 풀이

📌 문제

오늘은 신승원의 생일이다.

 

박승원은 생일을 맞아 신승원에게 인천국제공항을 선물로 줬다.

 

공항에는 G개의 게이트가 있으며 각각은 1에서 G까지의 번호를 가지고 있다.

 

공항에는 P개의 비행기가 순서대로 도착할 예정이며, 당신은 i번째 비행기를 1번부터 gi (1 ≤ gi ≤ G) 번째 게이트중 하나에 영구적으로 도킹하려 한다. 비행기가 어느 게이트에도 도킹할 수 없다면 공항이 폐쇄되고, 이후 어떤 비행기도 도착할 수 없다.

 

신승원은 가장 많은 비행기를 공항에 도킹시켜서 박승원을 행복하게 하고 싶어한다. 승원이는 비행기를 최대 몇 대 도킹시킬 수 있는가?

📌 입력

첫 번째 줄에는 게이트의 수 G (1 ≤ G ≤ 105)가 주어진다.

 

두 번째 줄에는 비행기의 수 P (1 ≤ P ≤ 105)가 주어진다.

 

이후 P개의 줄에 gi (1 ≤ gi ≤ G) 가 주어진다.

📌 출력

승원이가 도킹시킬 수 있는 최대의 비행기 수를 출력한다.

📌 문제 풀이

👨‍🏫 접근

모든 비행기는 1~G 까지의 게이트에 도킹할 수 있다. 그렇기 때문에 1번 게이트는 와일드카드로 남겨두는 것이 좋다. k번 게이트를 접근하려고 하는데 불가능하다면 k - 1, k - 2, ..., 2, 1 순으로 도킹하기 때문에 1번 게이트까지 이미 도킹되어 있다면 더 이상 도킹이 불가능해진다.

 

그래서 모든 순회는 역순으로 해준다. 이때, k 부터 k - 5번까지 이미 도킹이 되어있는 상태이고 n번째 비행기가 k번 게이트에 도킹하려고 한다면 바로 k - 6번 게이트로 유도하는 것이 좋다. 그렇기 때문에 매번 게이트로 도킹시킬 때, k의 부모를 k - 1로 설정해두는 것이 시간 복잡도를 줄일 수 있는 방법이다.

 

이때 사용하는 알고리즘이 유니온 파인드 트리이다.

👨‍🏫 문제 풀이

📄 전체 코드

import sys
input = sys.stdin.readline


def find_parent(parent, x):
    if parent[x] != 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)
    parent[a] = b


g = int(input())
p = int(input())

gates = [i for i in range(g + 1)]
cnt = 0
for _ in range(p):
    k = int(input())
    dock = find_parent(gates, k)
    if dock != 0:
        union_parent(gates, dock, dock - 1)
    else:
        break
    cnt += 1

print(cnt)

📄 준비

import sys
input = sys.stdin.readline


def find_parent(parent, x):
    if parent[x] != 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)
    parent[a] = b


g = int(input())
p = int(input())

gates = [i for i in range(g + 1)]
cnt = 0

기본적인 연산 함수를 생성하고 게이트의 부모를 설정하기 위해 리스트를 설정한다. 이때 유니온 합치기 연산에서 a의 부모는 b로 설정해준다. 이렇게 설정한 이유는 x번 게이트에 도킹한다고 할 때, x-1번 게이트로 부모를 설정해야 하기 때문이다. 이때, x번 게이트 혹은 x-1번 게이트가 이미 도킹되어 있을 수 있으니까 부모연산을 마치고 합쳐준다.

📄 풀이

for _ in range(p):
    k = int(input())
    dock = find_parent(gates, k)
    if dock != 0:
        union_parent(gates, dock, dock - 1)
    else:
        break
    cnt += 1

print(cnt)

도킹할 게이트의 부모를 찾아주고 그 부모 이전 게이트와 합쳐준다. 이로서 k번 게이트가 이미 도킹된 상태라면, 그의 부모를 찾아서 빈 게이트를 찾아낼 수 있다.

📌 총평

조금 어려웠다.

 

저작자표시 비영리 (새창열림)

'Algorithm > Data Structure' 카테고리의 다른 글

[Python - Data Structure, Union Find] 1976 여행 가자  (0) 2022.09.17
[Python - Data Structure, Map] 4195 - 친구 네트워크  (0) 2022.09.16
[Python - Data Structure, Union Find] 1717 집합의 표현  (0) 2022.09.16
[Python - heapq] 1655 가운데를 말해요  (0) 2022.09.06
[Python - heapq] 11286 절댓값 힙  (0) 2022.09.05
  1. 👨‍🏫 접근
  2. 👨‍🏫 문제 풀이
  3. 📄 전체 코드
  4. 📄 준비
  5. 📄 풀이
'Algorithm/Data Structure' 카테고리의 다른 글
  • [Python - Data Structure, Union Find] 1976 여행 가자
  • [Python - Data Structure, Map] 4195 - 친구 네트워크
  • [Python - Data Structure, Union Find] 1717 집합의 표현
  • [Python - heapq] 1655 가운데를 말해요
턴태
턴태
import { Dream } from "future";
턴태
턴태의 밑바닥부터 시작하는 de-vlog
턴태
전체
오늘
어제
  • ROOT (187)
    • Node.js (37)
      • ES6 (1)
      • TypeScript (3)
      • Express.js (16)
      • NestJS (16)
      • JS (24)
    • 프론트엔드 (29)
      • CS (5)
    • 백엔드 (1)
      • 검색 (2)
      • Database (1)
    • 기타 툴 (1)
      • git (1)
    • 데브옵스 & 인프라 (19)
      • Kubernetes (15)
      • Docker (2)
      • Monitoring (1)
      • IaC (1)
    • Algorithm (90)
      • Implementation & simulation (5)
      • Math (4)
      • Brute Force (1)
      • String (0)
      • Graph (5)
      • Recursion & Backtracking (19)
      • Divide & Conquer (2)
      • Dynamic Programming (18)
      • Greedy (13)
      • Priority Queue (2)
      • Binary Search (6)
      • Data Structure (7)
      • Shortest Path (5)
      • Minimum Spanning Tree (1)
      • Sorting (1)
      • Prefix Sum (1)
    • Linux (1)
      • Ubuntu (1)
    • Diary (5)
      • Algorithm (1)
      • Conference (1)
      • Retrospective (3)
    • Book (0)
      • Self-Development (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • baekjoon
  • 익스프레스
  • 인프런
  • 쿠버네티스
  • dynamic programming
  • 백트래킹
  • 토이프로젝트
  • backtracking
  • Kubernetes
  • 디프만
  • 오먹
  • 다이나믹 프로그래밍
  • Omuk
  • 자바스크립트
  • 네스트
  • 노드
  • 백준
  • GREEDY
  • TypeScript
  • 함수형 프로그래밍
  • 인프런X디프만
  • 파이썬
  • N과 M
  • Express
  • node.js
  • Toy Project
  • 타입스크립트
  • nestjs
  • k8s
  • python

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.1
턴태
[Python - Data Structure, Union Find] 10775 공항
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.