이분탐색을 활용한 알고리즘 문제풀이
오늘 푼 문제: 입국심사
입출력
- 입력: 입국심사를 기다리는 사람 수 n, 각 심사관이 한 명을 심사하는데 걸리는 시간이 담긴 배열 times가 매개변수로 주어집니다.
- 출력: 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 합니다.
예제 코드
import java.util.*;
class Solution {
public long solution(int n, int[] times) {
long lt = 0L;
long rt = Arrays.stream(times).max().getAsInt() * (long)n;
long answer = rt;
while(lt <= rt) {
long mid = (lt + rt) / 2;
long tmp = 0;
for (int time : times) tmp += mid / time;
if (tmp >= n) {
answer = Math.min(answer, mid);
rt = mid - 1;
} else lt = mid + 1;
}
return answer;
}
}
- 테스트 케이스가 정수형의 범위를 벗어난다는 걸 늦게 깨달았습니다...!
- 시간에 대해서 lt와 rt를 설정하여 이진탐색을 진행하였습니다.
- lt는 0, rt는 가장 오래걸리는 심사원에서 모두가 심사받을 경우로 초기화합니다.
- 그 후에는 주어진 시간에 심사된 인원에 따라서 lt와 rt를 조정하며 가장 적게 걸린 시간을 찾습니다.
- 이분탐색일 경우 return 값을 살펴보고 upper/lower bound를 결정해야한다.
- Lower Bound: 찾고자 하는 값이 처음으로 나오는 경우
- Upper Bound: 찾고자 하는 값보다 큰 값이 처음으로 나오는 경우
회고
- 테스트 케이스를 유심히 보자!
- 기본에 충실한 개발자가 되자!