Study
algorithm
coding-test
binary-search
43238

입국심사 (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의 과정을 거쳐 최선의 결과를 찾는다

코드

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;
}