입국심사
2019, Jun 02
- https://programmers.co.kr/learn/courses/30/lessons/43238
- 모든 사람이 심사를 받는데 걸리는 시간의 최소값을 이분법을 통해서 구할 수 있습니다.
- 보통 문제를 풀 때에는 어떤 알고리즘을 통하여 걸리는 시간을 구하게 되지만 이분법에서는 걸리는 시간을 대상으로 하여 가능한 시간을 구하게 됩니다.
- 먼저 대상이 될 수 있는 시간은 다음과 같습니다.
- 시간을 x라고 하면 \(\sum x // 심사관의 처리속도\)
- 이 때 총합이 입국자 n명보다 크다면 가능한 처리 시간입니다.
- 이 기준을 활용하여 이분법을 사용하면 가능한 최소시간을 구할 수 있습니다.
#include <string>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long ll;
int N;
bool check(ll x, vector<int>& times) {
ll sum = 0;
for (ll val : times) {
sum += x / val;
}
if (sum >= N) {
return true;
}
else {
return false;
}
}
long long solution(int n, vector<int> times) {
ll answer = 1000000000000000000LL;
N = n;
ll begin = 0;
ll end = 1000000000000000000LL;
while (begin <= end) {
ll mid = (begin + end) / 2;
if (check(mid, times)) {
answer = min(answer, mid);
end = mid - 1;
}
else {
begin = mid + 1;
}
}
return answer;
}