총 심사 시간은 1(left) ~ (최대로 오래걸리는 심사 * 대기인원)(right) 사이에있다.
이사이에서 문제 조건을 만족하는 최솟값을 구해야한다.
이분탐색으로 중간값인(mid) 시간((left + right) / 2) 을 먼저 정한다.
이때 중간값(mid)을 각심사대의 시간(times[n])으로 나눠주고 그 몫들을 더해준다.
예시를 들면 대기인원이 6명 최소시간이 1분 최대시간이 60분 중간값이 30 분 이라하자,
이때 물어보는것이다 너희 각심사대 30분 동안 몇명씩 처리가능해 ?
이때 각심사대의 심사시간 배열이 [7, 10] 이라면 첫번째 심사대는 4(30/7) 명처리 두번째는 3(30/10) 명이가능하다
그러면 총 7 명 처리할수 있다 . 이는 원래 대기인원보다 같거나 크므로 시간을 더줄일수있다는 것을 의미한다.
만약 대기인원보다 적게 처리가능하다면 시간을 너늘려야하는게 된다.
이와같은 방식으로 이분탐색 알고리즘을 처리하면 된다. 다음은 전체 코드이다.
function solution(n, times){
times.sort((a, b) => {
return a - b;})
let left = 1;
let right = n * (times[times.length - 1]);
let answer = right;
while(left <= right){
let mid = parseInt((left + right) / 2);
let cnt = 0;
times.forEach(value => {
cnt += parseInt(mid / value);
if(cnt >= n){
answer = Math.min(answer , mid);
}
});
if(cnt >= n){
right = mid - 1;
}
else{
left = mid + 1;
}
}
return answer
}
'프로그래머스' 카테고리의 다른 글
프로그래머스_스킬트리_자바 (0) | 2020.05.17 |
---|---|
프로그래머스_124 나라의 숫자_JAVA (0) | 2020.05.17 |
프로그래머스_섬연결하기 (0) | 2020.05.07 |
프로그래머스_H-index (0) | 2020.05.07 |
프로그래머스_탑 (0) | 2020.05.07 |