PS/프로그래머스

입국심사 (lv3)

ForteQook 2022. 8. 2. 17:22

문제 설명

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

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

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

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

제한 사항

  • 입국심사를 기다리는 사람은 1명 이상 1,000,000,000명 이하입니다.
  • 각 심사관이 한 명을 심사하는데 걸리는 시간은 1분 이상 1,000,000,000분 이하입니다.
  • 심사관은 1명 이상 100,000명 이하입니다.

 가장 먼저 눈에 들어오는 것은 대기자가 최대 10억 명에 각 심사관의 심사 시간이 최대 10억 분이라는 것이다. 따라서 한명 한명 가장 본인의 대기시간이 적게 걸리는 부스를 선택하는 방식은 쓸 수 없다.

 이 문제에서의 핵심은 각 심사관들은 어찌됐건 자신의 심사 시간에 한 명씩 밖에 심사하지 못한다는 것이다. 너무나 당연한 사실이지만, 특정 시간까지 각 심사관은 자신이 소화할 수 있는 분량만 소화 가능하다는 점을 깨닫는게 중요한 것이다. 조건에 의해 대기자들은 심사대를 선택해서 줄을 설 수 있기 때문에, 다시말해 "줄을 어디에 반드시 서야한다는" 조건자체가 없기 때문에 이 문제는 단순히 특정 시간까지 각 부스가 소화 가능한 업무량을 더해준 뒤 목표치인 n과 비교해주면 된다.

 예를 들면 대기자가 11명이고, 각 심사대의 한 명당 소요시간이 [4, 5, 7, 7, 8]로 주어진다고 하자. 모든 사람들이 가장 시간이 오래걸리는 마지막 심사대에 줄을 선다고 가정하면, 소요시간은 총 8*11 = 88분이 될 것이다. 최소시간을 1분이라 했을 때 중간 값인 44분까지 각 부스가 소화 가능한 업무량을 더하면, 11+8+6+6+5=36, 총 36명이 된다. 이는 목표치인 11명보다 터무니 없이 많으므로, 우린 36분보다 적은 시간으로 해낼 수 있다는 것을 알 수 있다. 이런식으로 이진 탐색을 진행하면 답을 얻을 수 있다. 

코드

def solution(n, times):
    answer = 0
    times.sort()
    length = len(times)
    start = 1
    end = (n-length+1)*times[-1]
    
    while start < end:
        mid = (start + end) // 2
        s = 0
        for time in times:
            s += mid // time
        
        if n > s:
            start = mid + 1
            answer = start
        else:
            end = mid
    
    return answer

'PS > 프로그래머스' 카테고리의 다른 글

자물쇠와 열쇠 (lv3)  (0) 2022.08.08
여행경로 (lv3)  (0) 2022.08.04
가사 검색 (lv4)  (0) 2022.08.02
전화번호 목록 (lv2)  (0) 2022.07.31
아이템 줍기 (lv3)  (0) 2022.07.30