안녕하세요! 오늘은 프로그래머스의 입국심사 문제를 풀어보겠습니다 (❁´◡`❁)
https://programmers.co.kr/learn/courses/30/lessons/43238
이진탐색을 이용해 푸는 문제입니다. 탐색할 대상은 총 소요 시간이며, 총 소요시간을 times배열로 나누었을 때 값이 n보다 크면 시간이 덜 필요하므로 right = mid -1이 되고, n보다 작으면 시간이 더 필요하므로 left = mid+1이 됩니다.
static long binarySearch(int[] times, int n, long max){
//이진탐색을 수행하는 데 필요한 left, right, mid 변수 선언
long left, right, mid;
long ans;
while(right가 left보다 클 때){
mid = (left+right)/2;
if(mid시간동안 심사할 수 있는 사람 수가 n보다 많다면){
ans = mid와 ans 중 더 작은 값
right = mid - 1;
} else{ //mid시간동안 심사할 수 있는 사람 수가 n보다 적다면
left = mid + 1;
}
}
return ans;
}
import java.util.*;
class Solution {
public long solution(int n, int[] times) {
Arrays.sort(times);
return binarySearch(times, n, times[times.length-1]);
}
static long binarySearch(int[] times, int n, long max){
long left = 0;
long right = n*max;
long mid = 0;
long ans = Long.MAX_VALUE;
while(left <= right){
mid = (left+right)/2;
if(needsMoreTime(times, mid, n)){ //시간이 덜 필요
ans = ans > mid ? mid : ans;
right = mid - 1;
} else{ //시간이 더 필요
left = mid + 1;
}
}
return ans;
}
//시간이 더 필요한지, 덜 필요한지 계산하는 함수
static boolean needsMoreTime(int[] times, long mid, int n){
long passedAmount = 0;
for(int i=0; i<times.length; i++){
passedAmount = passedAmount + mid/times[i];
}
if(passedAmount >= n) return true; //시간이 덜 필요함
else return false; //시간이 더 필요함
}
}