입국심사

입국심사

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;
}