본문 바로가기

c++/Study

이분 탐색

나중에 기억하기 쉽게 최대한 심플하게 정리

 

1. 먼저 가능한 answer의 범위의 최대값과 최소값을 구한다.

-> min, max

 

2. start 와 end를 초기화 + mid도 초기화

-> 당연히 처음에는 start = min, end = max

-> mid = (min+max)/2

 

3. while문을 사용, 루프 조건은 while( start<=end )

 

4. mid와 찾고자 하는 target을 비교

mid == target : 정답

mid < target : start = mid+1

mid > target : end = mid - 1

 

사용 예제

프로그래머스 입국 심사

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

 

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

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

programmers.co.kr

 

구해야하는 것 : 모든 사람이 심사받는 최소 시간

 

풀이

1) 심사 받는 최소시간 최대시간 초기화

최소 시간 : 1

최대시간 : 가장 오래걸리는 사람한테 n명이 모두 심사 받을때

 

2) mid시간에서 실제로 가능한지 여부를 판단

-> 불가능할 수 도 있음

-> min = mid+1

 

3) mid에서 가능한 경우, answer와 비교하여 최솟값인지 판단.

-> max = mid-1

 

 

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

using namespace std;

long long solution(int n, vector<int> times) {
    sort(times.begin(), times.end());
    long long min = 1;
    long long max = (long long)(times[times.size()-1])*n;
    long long answer = max;
    
    // 이분 탐색으로 찾을 때 까지
    while(min<=max){
        // mid 는 총 걸린 시간
        long long mid = (min + max)/2;
        long long sum = 0;
        
        // 심사위원당 맡을 수 있는 사람 수 더하기
        for(int i=0;i<times.size();i++)
        {
            sum += mid /(times[i]);
        }
        
        if(sum >= n)
        {
            if(answer > mid)
                answer = mid;
            max = mid-1;
        }
        // 불가능 -> 시간을 더 많이
        else{
            min = mid+1;
        }
            
    }
    return answer;
}

 

'c++ > Study' 카테고리의 다른 글

다익스트라(Dijkstra) 알고리즘 간단 정리  (0) 2021.10.04
c++ StringStream 사용법  (0) 2021.08.06
알고리즘  (0) 2021.06.19
상속  (0) 2021.05.25
객체간 관계  (0) 2021.05.24