본문 바로가기

코딩테스트 연습/programmers

[Programmers] 이분탐색 > 입국심사(c++)

https://programmers.co.kr/learn/courses/30/lessons/43238

 

코딩테스트 연습 - 입국심사

n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다. 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한

programmers.co.kr

 

이분탐색의 기준을 "시간"으로 설정했다.

start의 초깃값은 심사관을 기다리지않고 한번에 통과 했을때의 시간이고,

end의 초깃값은 가장 늦은 심사관을 모두 통과했을때의 시간이다.

 

1. mid는 start와 end의 평균값으로 설정

2. 현재 mid시간에서 통과할 수 있는 인원의 수를 person변수에 누적

3. 인원 수가 통과할 수 있는 인원수(=person) n보다 많으면 end범위를 mid - 1만큼 줄임

4. 인원 수가 통과할 수 있는 인원수 n보다 많으면 start범위를 mid + 1 만큼 늘림

5. start > end일때 반복문 종료, answer은 현재 start의 값 출력

 

#include <vector>
#include <string>
#include <algorithm>
using namespace std;
long long solution(int n, vector<int> times) {
    long long answer = 0;
    
    long long start = 1;
    long long end = (long long)*max_element(times.begin(), times.end())*(long long) n;
    long long mid;
    
    while (start <= end) {
        long long person = 0;
        mid = (start+end)/2;
        
        for(int i=0;i<times.size();i++) person += mid / times[i];
        
        if(n <= person) {
            end = mid - 1;
        }
        else if(n > person){
            start = mid + 1;
        }
        answer = start;
    }
     return answer;
}