문제

[프로그래머스] 입국심사 (LV. 3)

요약

  • n명의 사람이 입국심사를 받기 위해 줄을 서있다.
  • 각 입국 심사대는 한 명 씩 심사를 진행한다. 각 심사대는 심사에 걸리는 시간이 다르다.
  • 가장 앞에 서 있는 사람은 비어있는 심사대에 가서 심사를 받거나, 더 빨리 심사가 끝나는 심사대가 있다면 그곳으로 가서 심사를 받을 수 있다.
  • 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 반환하자.

분류

  • 이진탐색

풀이

1. 내 풀이

  • 특이사항으로, 입국심사를 기다리는 최대 인원수 제한이 1,000,000,000명이다. 심사대의 심사 최대 시간도 1,000,000,000분이다. 전체적으로 수가 크다. 결국 answer 에 해당하는 반환값을 기준으로 생각해야한다.
  • 모든 사람이 심사를 받는 시간을 가장 짧게 하려면, 모든 심사대가 쉼 없이 돌아가야 한다.
  • 주어진 시간 내에 몇 명이 각 심사대에서 심사받을 수 있는지 구한 후, 더하면 최대 심사 인원이 나온다. 심사받은 사람들의 수를 기준으로 생각했기 때문에, 심사대에 사람이 없는 시간은 고려하지 않아도 된다.
def solution(n, times):
    answer = 0
    left, right = 0, n * max(times)

    while left <= right:
        mid = (left + right) // 2
        people = 0

        for time in times:
            people += mid // time
            if people > n: break

        if people >= n:
            answer = mid
            right = mid - 1

        elif people < n:
            left = mid + 1
    return answer