제한사항에 있는 최댓값들을 보면 선형 탐색으로는 절대 제한시간 안에 문제를 풀 수가 없다는 것을 알 수 있다. -> 이진 탐색을 사용하자!
구하고자 하는 값 : 모든 사람이 심사를 받는데 걸리는 시간의 최솟값
모든 사람들이 가장 오래걸리는 심사대에서 심사를 받는 경우(max(times) * n)가 최악의 경우이기 때문에 끝값으로 두고, 시작값은 간편하게 0으로 두었다.
❗주의할 점은 이진 탐색의 경우에는 내가 찾고자 하는 값을 얻게 되면 바로 그 값이 정답이 되지만 이 문제의 경우에는 "최솟값" 을 찾는 것이기 때문에 조건을 만족하는 값을 얻게 되더라도 더 작은 수로도 조건을 만족하는 값이 있는지 찾아야 한다는 것이다.
def solution(n, times):
answer = 0
# 시작값(i)과 끝값(j) 설정
i,j = 0, max(times) * n
# 이진 탐색 시작
while i <= j:
m = (i + j) // 2
# tmp_n : m분동안 심사를 받을 수 있는 사람의 수를 담는다.
tmp_n = 0
for time in times:
tmp_n += (m//time)
# m분동안 심사를 받을 수 있는 사람 수가 n보다 크거나 같다면(조건 만족)
if n <= tmp_n:
answer = m
j = m - 1
else:
i = m + 1
return answer