82.프로그래머스[n명이 입국심사]
26 Mar 2021 | Daily Algorithms
#include <string>
#include <vector>
#include <algorithm>
// 이분 탐색을 이용해 문제를 해결, 모든 사람을 심사하는 시간의 min 1, max는 오래 걸리는 심사관이 모든 사람을 처리 할 때 걸리는 시간입니다. 따라서 max(times 중 가장 큰 원소 * n)
// 어떤 시간이 주어졌을 때, 주어진 시간에 입국심사할 수 있는 모든 사람의 수를 합쳐 people_sum에 저장
// people_sum이 n보다다 작다면 정답은 mid보다 크므로 min = mid+1;을 합니다. 반대로 people_sum이 n이상이라면 정답이 mid보다 작거나 같으므로 max = mid-1;
// anwer = mid;를 합니다.
// min이 max보다 커질 때까지 위의 과정을 반복합니다.
using namespace std;
long long solution(int n, vector<int> times) {
long long answer = 0, people_sum;
long long min =1, mid;
long long max = *max_element(times.begin(), times.end()) * (long long)n;
// 가장 심사 기간 제일 긴 사람이 처리하는 사람의 수의 곱을 통한 시간의 합
answer = max;
// 심사관당 처리할 수 있는 사람의 수를 구한다.
while(min<=max)
{
people_sum = 0;
mid = (min+max)/2;
for(int i = 0; i<times.size(); i++)
{
people_sum += mid/times[i];
}
// 작을 경우 민값 미드 +1
if(people_sum<n)
{
min = mid+1;
}
// 그렇지 않을 경우 맥스 미드-1
else{
max = mid-1;
answer = mid;
}
}
return answer;
}
#include <string>
#include <vector>
#include <algorithm>
// 이분 탐색을 이용해 문제를 해결, 모든 사람을 심사하는 시간의 min 1, max는 오래 걸리는 심사관이 모든 사람을 처리 할 때 걸리는 시간입니다. 따라서 max(times 중 가장 큰 원소 * n)
// 어떤 시간이 주어졌을 때, 주어진 시간에 입국심사할 수 있는 모든 사람의 수를 합쳐 people_sum에 저장
// people_sum이 n보다다 작다면 정답은 mid보다 크므로 min = mid+1;을 합니다. 반대로 people_sum이 n이상이라면 정답이 mid보다 작거나 같으므로 max = mid-1;
// anwer = mid;를 합니다.
// min이 max보다 커질 때까지 위의 과정을 반복합니다.
using namespace std;
long long solution(int n, vector<int> times) {
long long answer = 0, people_sum;
long long min =1, mid;
long long max = *max_element(times.begin(), times.end()) * (long long)n;
// 가장 심사 기간 제일 긴 사람이 처리하는 사람의 수의 곱을 통한 시간의 합
answer = max;
// 심사관당 처리할 수 있는 사람의 수를 구한다.
while(min<=max)
{
people_sum = 0;
mid = (min+max)/2;
for(int i = 0; i<times.size(); i++)
{
people_sum += mid/times[i];
}
// 작을 경우 민값 미드 +1
if(people_sum<n)
{
min = mid+1;
}
// 그렇지 않을 경우 맥스 미드-1
else{
max = mid-1;
answer = mid;
}
}
return answer;
}
Comments