입출력 예 설명
가장 첫 두 사람은 바로 심사를 받으러 갑니다.
7분이 되었을 때, 첫 번째 심사대가 비고 3번째 사람이 심사를 받습니다.
10분이 되었을 때, 두 번째 심사대가 비고 4번째 사람이 심사를 받습니다.
14분이 되었을 때, 첫 번째 심사대가 비고 5번째 사람이 심사를 받습니다.
20분이 되었을 때, 두 번째 심사대가 비지만 6번째 사람이 그곳에서 심사를 받지 않고 1분을 더 기다린 후에 첫 번째 심사대에서 심사를 받으면 28분에 모든 사람의 심사가 끝납니다.
접근법
이번 문제는 이분탐색을 이용하는 문제입니다. 한 명의 심사위원에게 주는 시간을 이분탐색 값으로 설정합니다. 전체 길이는 '심사하는데 가장 오래 걸리는 시간 x 사람 수'로 설정을 해줍니다. 이제 반복문을 통해 구해보면, mid는 한 심사위원에게 주어진 시간을 뜻합니다. check는 입국 심사를 완료한 사람의 수를 뜻합니다. mid//time을 하면 심사위원이 입국 심사를 할 수 있는 최대 사람 수를 뜻합니다. 모든 사람 수를 check에 더해주고, check가 기존에 심사해야하는 사람 수보다 많을 경우에는 이를 줄어줍니다. 즉, right값을 줄여주시면 됩니다. 반면에 심사해야하는 사람 수 보다 적은 경우에는 left값을 높여 주면 됩니다.
나의 코드
def solution(n, times):
left, right, answer = 0, max(times)*n, 0
while(right >= left):
mid = (right + left)//2
check = 0
for time in times:
check += mid//time
if check >= n:
answer = mid
right = mid - 1
else: left = mid + 1
return answer