탑승구 코드 및 해설 (파이썬)

2021. 7. 13. 14:20algorithm

반응형

출처: 이것이 취업을 위한 코딩 테스트다 with 파이썬, Q 42, p 395

 

비행기를 '최대' 몇 대 도킹할 수 있는지 출력해야 하므로 이진 탐색을 이용해 풀이했습니다. 

먼저 도킹할 수 있는 비행기의 최소 대수를 1대, 최대 대수를 게이트의 개수인 G대로 설정합니다.

이후 중간값을 계산하고, 이 중간값만큼의 비행기를 도킹할 수 있는지 확인합니다.

비행기를 순서대로 도킹한다고 했으므로, 중간값 개수만큼의 도킹 정보를 가져오고, 이를 dock라는 함수에 전달합니다.

 

dock 함수는 도킹 정보 리스트를 받아 모든 비행기를 도킹할 수 있으면 True, 아니면 False를 반환하는 함수입니다.

이는 힙을 이용해 구현했는데, 파이썬의 heapq는 Min Heap이므로, Max Heap으로 사용하기 위해 각 element에 -1을 곱해줍니다. 이후 게이트의 최댓값을 pop해가면서 이 최댓값이 도킹해야할 비행기 대수보다 크거나 같으면, 비행기 대수를 1씩 감소시키고, 그렇지 않으면 바로 while문을 종료합니다.

while문을 종료했을 때 heap에 더 이상 도킹해야 할 비행기가 남지 않았으면 True, 남아 있으면 False를 반환합니다. 

 

중간값의 개수만큼 도킹할 수 있는 경우, answer에 현재 중간값을 저장하고, 더 많은 비행기를 도킹할 가능성도 있으니 중간값을 늘립니다.

중간값의 개수만큼 도킹할 수 없는 경우, 중간값을 줄입니다. 

 

import sys
import heapq

# 입력 받아오기 
inputs = list(map(int, sys.stdin.read().split()))
# 탑승구 개수
G = inputs[0]
# 비행기 개수 
P = inputs[1]
# 각 비행기의 도킹 가능 번호 
dockings = inputs[2:]

# 도킹 가능하면 True, 아니면 False 
def dock(dockings):
    # 도킹해야 할 비행기 개수 
    N = len(dockings)
    # max heap
    q = [(-1)*d for d in dockings]
    heapq.heapify(q)
    
    while q:
        max_gate = heapq.heappop(q)
        # 게이트 최댓값이 N 이상이면, 최댓값 게이트에 비행기 도킹
        if max_gate * (-1) >= N:
            N -= 1 
        else:
            break
            
    # 도킹해야 할 비행기가 남아있지 않으면 True, 남아 있으면 False 
    return True if len(q) == 0 else False   
    
    
# 최댓값: 탑승구 개수 
max_val = G
# 최솟값: 1 
min_val = 1 

answer = None 
# 이진 탐색 
while min_val <= max_val:
    mid_val = (min_val + max_val) // 2 
    # 도킹 가능하면 우선 answer에 현재 중간값 저장
    # 더 많은 비행기 도킹할 수 있는지 확인 
    if dock(dockings[:mid_val]):
        answer = mid_val
        min_val = mid_val + 1 
    # 도킹할 수 없으면 중간값 줄이기 
    else:
        max_val = mid_val - 1 

print(answer)
반응형

'algorithm' 카테고리의 다른 글

금광 코드 및 해설 (파이썬)  (0) 2021.07.26
어두운 길 코드 및 해설 (파이썬)  (0) 2021.07.14
여행 계획 코드 및 해설 (파이썬)  (0) 2021.07.12
그래프 이론  (0) 2021.07.12
숨바꼭질 코드 및 해설 (파이썬)  (0) 2021.07.08