문제 설명
n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다.
처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있습니다.
모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다.
입국심사를 기다리는 사람 수 n, 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times가 매개변수로 주어질 때, 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 하도록 solution 함수를 작성해주세요.
제한사항
- 입국심사를 기다리는 사람은 1명 이상 1,000,000,000명 이하입니다.
- 각 심사관이 한 명을 심사하는데 걸리는 시간은 1분 이상 1,000,000,000분 이하입니다.
- 심사관은 1명 이상 100,000명 이하입니다.
풀이
먼저 문제를 읽고 n명의 사람을 어떤 순서로 심사대에 배치해야할까 생각했다
순서대로 빈 자리에 넣을수도 있겠지만 심사 속도가 더 빠른 심사대를 기다렸다가 넣는 경우도 고려를 해야한다
사실 제한사항에 10억이라는 최대범위가 있기에 O(N)으로도 시간초과가 날 것이다
O(logN) 으로 탐색할 수 있는 이분탐색 알고리즘을 적용 가능한지 생각해본다
n명의 사람 | x명의 심사관 | t분의 시간
3가지 관점으로 이분탐색 알고리즘 적용이 가능한지 고민해보았고, 결국 우리가 구하고자 하는 t분의 시간을 매개변수로 하여 이분탐색을 하면 되겠다는 결론이 났다
def solution(n, times):
answer = 0
l,r = 0,10**15
while l <= r:
m = (l+r)//2
tmp = 0
for t in times:
tmp += m//t
if tmp >= n:
answer = m
r = m-1
else:
l = m+1
return answer
다만 여기서 r을 제한사항의 최대값인 10^10 으로 뒀을 때 틀리는 테스트케이스가 발생하는데 왜 그런지는 찾아봐야 알 것 같다
'알고리듬 > 이분탐색' 카테고리의 다른 글
[백준 2805] 나무 자르기 (0) | 2024.11.02 |
---|---|
[백준 11561] 징검다리 (0) | 2024.10.30 |
[백준 1072] 게임 (0) | 2024.10.28 |