문제 출처 - 링크


알고리즘 분류
📋 문제 요약 설명
- 각 입국 심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다르다.
- 처음에 모든 심사대는 비어있다.
- 한 심사대에서는 동시에 한 명만 심사를 할 수 있다.
- 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있다.
- 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있다.
- 모든 사람이 심사를 받는데 걸리는 시간의 최솟값을 return 구하라
💡 알고리즘 설계 / 접근 방법
- 시간을 가지고 이분 탐색을 사용한다.
- 시간 배열에서 가장 작은 값과 가장 큰 값에 통과해야 할 인원수를 곱해서 최소 시간과 최대 시간을 구한다.
- 최소 시간과 최대 시간의 중간 값으로 통과가 가능한 인원을 계산한다.
- 통과 가능한 인원이 통과해야 할 인원이 될 때까지 최소 시간과 최대 시간의 범위를 조정한다.
✅ 풀이
시간 복잡도 → O(m × log T)
- m = 심사관 수, T = 최대 가능한 시간 ≈ n × 최장 심사 시간
- 정렬 : O(m log m)
- 전체 이분 탐색 : O(m × log(max_time))
- 이분 탐색 반복 횟수 : O(log(max_time))
- 각 이분 탐색 내에서 반복 : O(m)
import java.util.*;
class Solution {
public long solution(int n, int[] times) {
long answer = 0;
Arrays.sort(times);
long minTime = (long)times[0];
long maxTime = (long)times[times.length-1] * n;
while (minTime <= maxTime) {
long mid = (minTime + maxTime) / 2;
long pass = 0;
for (int time : times) {
pass += mid / time;
if (pass >= n)
break;
}
if (pass >= n) {
answer = mid;
maxTime = mid - 1;
} else {
minTime = mid + 1;
}
}
return answer;
}
}