프로그래머스-이분탐색: 입국심사(Javascript)
문제링크 : https://programmers.co.kr/learn/courses/30/lessons/43238
문제
문제를 해결한 방법
이분탐색 문제로 저는 다음과 같이 풀이했습니다.
- times를 오름차순으로 정렬시킨다.
- 가장 늦게 끝나는 시간을 구한다
    - 가장 오래걸리는 심사대 * n
 
- 이분탐색으로 해당 시간에 각 심사대의 최대 심사 수의 합인count를 구한다.
- count >= n인 경우- 최솟값을 갱신한다.
- mid의 왼쪽을 탐색한다.
        - right = mid-1;
 
 
- count < n인 경우- mid의 오른쪽을 탐색한다.
        - left = mid+1
 
 
- mid의 오른쪽을 탐색한다.
        
예시
문제 예시처럼 입력값이 n=6 times=[7,10] 인 경우
- times를 오름차순으로 정렬시킨다.
- 가장 늦게 끝나는 시간을 구한다 ->  60초(= 10*n)
- 이분탐색으로 처음 mid는 30초이다. (left: 0 , right: 60) // 1부터 해도 됨- 30초에 각 심사대는 4명(30/7), 3명(30/10) 총 7명을 심사한다.
 
- 7 >= n이므로 min을 30으로 갱신하고 mid의 왼쪽을 탐색한다.- 탐색범위 (left: 0 , right: 29)
- mid = 14
 
- 이분탐색이 끝날 때 까지 3,4번을 반복한다.
- min을 리턴한다.
소스 코드
const binarySearch= (times, n) =>{
    let left = 0;
    let right = times[times.length-1] * n;
    let mid = Math.floor((left+right) / 2);
    let min = right;
    
    while(left <= right){
        const count = times.reduce((acc, el) => acc+= Math.floor(mid / el), 0);
        if(count >= n){
            min = Math.min(min, mid);
            right = mid-1;
        }else
            left = mid+1;
        
        mid = Math.floor((left+right) / 2);
    }
    return min;
}
function solution(n, times) {
    times.sort((a,b) => a-b);
    return binarySearch(times, n);
}
 
      
    
Comments