본문 바로가기

ALGORITHM_PRACTICE

[프로그래머스] 입국심사

[프로그래머스] 입국심사

 

코딩테스트 연습 - 입국심사 | 프로그래머스

n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다. 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 명만 심사를 할 수 있습니다. 가장 앞에 서 있는 사람은 비어 있는 심사대로 가서 심사를 받을 수 있습니다. 하지만 더 빨리 끝나는 심사대가 있으면 기다렸다가 그곳으로 가서 심사를 받을 수도 있습니다. 모든 사람이 심사를 받는데 걸리는 시간을 최소로 하고 싶습니다. 입국심사

programmers.co.kr

 

이분탐색으로 분류되어 있는 문제다. 핵심은 이분탐색을 하는데, 입국 심사관이 검사할 수 있는 사람들 수를 맞추면서 가장 최소가 되는 시간을 구하면되는 것이다. 가장 최악의 시간이 되는시간은 가장 오래걸리는 심사관 * 입국인원수이다. 최소의 시간 + 최대의 시간의 중간점을 구해서 이 중간시간으로 몇명을 심사할 수 있는지 나눗셈을 통해 파악한다. 인원수가 n보다 작으면 최소시간을 중간시간 + 1을 해준다. n보다 크거나 같으면 최대시간을 중간시간 -1을 해주되 최소의 시간을 구해야 하므로 중간시간이 전에 구했던 최소시간보다 작으면 지금의 중간시간을 최소시간으로 한다.

 

 

 

#include<vector>
#include<algorithm>

using namespace std;

long long solution(int n, vector<int> times){
	long long answer = 0;

	sort(times.begin(), times.end());
	long long left = 0;
	long long right = (long long)times[times.size() - 1] * (long long)n;
	answer = right;
	while(left <= right){
		long long mid = (left + right) / 2;
		long long cnt = 0;
		for(int i = 0; i < times.size(); i++){
			cnt += (mid / times[i]);
		}
		if(cnt < n){
			left = mid + 1;
		}
		else{
			if(answer > mid) answer = mid;
			right = mid - 1;
		}
	}

	return answer;
}

'ALGORITHM_PRACTICE' 카테고리의 다른 글

[프로그래머스] 라면공장  (0) 2019.12.08
[프로그래머스] 땅따먹기  (0) 2019.12.07
[프로그래머스] 숫자 야구  (0) 2019.11.22
[프로그래머스] 여행경로  (0) 2019.09.27
[프로그래머스] 가장 큰 수  (0) 2019.09.27