Algorithm & Data Structure/Programmers

[Programmers]Python_입국심사

ju_young 2020. 12. 8. 14:45
728x90
문제
문제 설명

n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다.

처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있습니다.

모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다.

입국심사를 기다리는 사람 수 n, 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times가 매개변수로 주어질 때, 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 하도록 solution 함수를 작성해주세요.

제한사항
  • 입국심사를 기다리는 사람은 1명 이상 1,000,000,000명 이하입니다.
  • 각 심사관이 한 명을 심사하는데 걸리는 시간은 1분 이상 1,000,000,000분 이하입니다.
  • 심사관은 1명 이상 100,000명 이하입니다.
코드
def solution(n, times):
    answer = 0
    left, right = 1, max(times) * n #심사 시간의 최소, 최대 시간을 지정
    
    while left < right:
        mid = left + (right - left) // 2 
        #1. 각 심사관별 mid시간동안 심사할 수 있는 사람 수를 계산
        #2. 심사한 사람 수의 합이 n보다 크거나 같으면 걸린 시간은 right보다 작거나 같다
        if sum[time // mid for time in times] >= n:
            right = mid
        else:
            left = mid + 1 #심사한 사람 수가 n보다 작으면 걸린 시간이 left보다 크다
            
    return left

 

진행 과정
예제 #1

n = 6

times = [7, 10]

 

1) left = 1, right = 60

2) mid = 30

 

3) left = 1, right = 30 #30동안 심사할 수 있는 사람 수가 6보다 크거나 같으므로 right = mid

4) mid = 15

 

5) left = 16, right = 30 #15동안 심사할 수 있는 사람 수가 6보다 작으므로 left = mid + 1

6) mid = 23

 

7) left = 24, right = 30 #이전 과정 반복

8) mid = 27

 

9) left = 28, right = 30 #이전 과정 반복

10) mid = 29

 

11) left = 28, right = 29 #이전 과정 반복

12) mid = 28

 

13) left = 28, right = 28 #left == right이므로 반복 break

14) return left = 28

 

 

 

위 코드에서 mid를 계산할 때 (left + right) // 2가 아닌 left + (right - left) // 2로 계산한 이유를 알고싶다면 다음 글의 마지막 부분을 확인해보자.

 

Binary Search(이분 탐색)

728x90