입국심사 (opens in a new tab)
문제 해결 방법
- 이진탐색을 활용해 모든 심사시간의 최솟값을 구한다
- r(right)값은 최악의 경우인
n * Math.max(...times)
로 설정한다 - completedCnt는 특정 시간(mid)에 각 심사관이 검사할 수 있는 사람의 수이다
- 예를 들어, 30분이라는 시간이 주어지고, 각 심사관마다 [7, 10]분이 걸린다고 가정하자
- 이 경우, completedCnt는
30/7 + 30/10
의 결과인 7명이다
- completedCnt가 구해야하는 값(n)보다 크거나 같다면,
r = mid - 1
, 작다면l = mid + 1
의 과정을 거쳐 최선의 결과를 찾는다
- r(right)값은 최악의 경우인
코드
function solution(n, times) {
let l = 1;
let r = n * Math.max(...times);
while (l <= r) {
const mid = Math.floor((l + r) / 2);
const completedCnt = times.reduce((acc, cur) => acc + Math.floor(mid / cur), 0);
completedCnt >= n ? (r = mid - 1) : (l = mid + 1);
}
return l;
}