
입국심사를 기다리는 거대한 인원(명)을 처리하기 위한 최소 시간을 구하는 문제다. 대기 인원수가 너무 많아 시뮬레이션은 불가능하다. 대신 "특정 시간()이 주어졌을 때 명을 처리할 수 있는가?"를 확인하는 파라메트릭 서치(Parametric Search) 방식을 사용하여 효율적으로 정답을 찾아낸다.
long long을 써야 한다.left: 1분 (최소)right: 가장 느린 심사관의 시간 (최악의 경우)mid 동안 각 심사관이 처리할 수 있는 인원수(mid / times[i])를 모두 더한다.right 감소).left 증가).#include <string>
#include <vector>
#include <algorithm>
using namespace std;
long long solution(int n, vector<int> times) {
long long answer = 0;
// 탐색 범위 설정
// 최악의 경우: 가장 오래 걸리는 심사관이 n명을 모두 처리하는 경우
// times 안에 있는 값 중 최댓값을 구해서 n을 곱한다.
long long max_time = *max_element(times.begin(), times.end());
long long left = 1;
long long right = max_time * n;
// 이분 탐색 (Binary Search)
while (left <= right) {
long long mid = (left + right) / 2;
long long count = 0;
// 결정 로직: mid 시간 동안 몇 명을 심사할 수 있는가?
for (int t : times) {
count += mid / t;
// 오버플로우 방지: 이미 n명을 넘겼다면 더 계산할 필요 없음
if (count >= n) break;
}
if (count >= n) {
// n명 이상 처리가 가능하다면, 시간이 넉넉하다는 뜻
answer = mid; // 현재 시간을 정답 후보로 저장
right = mid - 1;
} else {
// n명을 처리 못 한다면, 시간이 부족하다는 뜻
left = mid + 1;
}
}
return answer;
}
int를 썼으나, 이 되어 오버플로우가 발생할 수 있음을 깨닫고 long long으로 수정했다.count를 계산할 때도 숫자가 매우 커질 수 있다. 루프 안에서 count >= n이 되면 즉시 break를 걸어주어 불필요한 연산과 잠재적인 오버플로우를 막았다.| 항목 | 내용 |
|---|---|
| 유형 | 이분 탐색 (Binary Search), 파라메트릭 서치 |
| 체감 난이도 | 중 (이분 탐색의 기준을 '시간'으로 잡는 것이 핵심) |
| 복잡도 | 시간: (: 심사관 수, : 가능한 최대 시간) |
| 새로 배운 것 | 입력값이 10억 단위일 때는 주저 없이 알고리즘을 떠올려야 하며, long long 사용이 필수적이다. |