쾌락없는 책임 (공부)/알고리즘 문제풀이

프로그래머스 입국심사 - C++

허스크 2021. 5. 19. 00:06
반응형
 

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

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

programmers.co.kr

#include <string>
#include <vector>
#include <algorithm>

using namespace std;
long long left, right, mid, allTime;

long long solution(int n, vector<int> times) {
    long long answer = 0;
    sort(times.begin(), times.end());
    
    left = 1;
    right = (long long) times[times.size() - 1] * n;
    
    while(left <= right){
        mid = (left + right) / 2;
        
        allTime = 0;
        
        for(int i = 0; i < times.size(); i++)
            allTime += mid / times[i];
        
        // 시간 부족
        if(allTime < n)
            left = mid + 1;
        else { // 시간 충분
            answer = mid;
            right = mid - 1;
        }
    }
    
    return answer;
}

뭔가 어떻게 이진탐색을 해야하지 고민이 되는 문제였습니다. 범위만 잘 잡는다면 금방 풀 수 있습니다.

1. 이진탐색의 left는 최소로 잡기 위해 1로 설정
2. right의 경우 나올 수 있는 최고의 경우,
즉 [제일 오래 걸리는 검사관 X 사람 수]

 위 조건대로 left와 right를 설정해준다면 이후는 평소의 이진탐색대로 할 수 있으며 마지막에 나오는 mid 가 answer가 됩니다

반응형