🖥️ CS/Baekjoon Algorithms

#2805 나무 자르기 (C++)

한국의 메타몽 2020. 5. 25. 17:03
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    long long N,M,min = 0, maxn = 0;
    cin >> N >> M;
    long long v[N];

    for(int i=0; i<N; i++){
        cin >> v[i];
        maxn = max(maxn,v[i]);
    }

    while(min<=maxn){
        long long mid = (min + maxn) / 2;
        long long tree = 0;
        for(int i=0; i<N; i++){
            if(v[i]-mid>0) tree+=v[i]-mid;
        }
        if(M<=tree){
            min = mid+1;
        }
        else if(M>tree){
            maxn = mid - 1;
        }
    }

    cout << maxn << "\n";

	return 0;
}

이분탐색법을 사용하다가 오답이 나왔고, 관련하여 해결책을 찾던 도중

'파라메틱 서치(탐색)' = Parametic Search 개념을 알게되었다. 

 

기존의 이분탐색법은 '정해진 값 = 정수'를 '정렬 된 알고리즘'에서 찾는 방식이었는데, 

파라메틱 서치는 '변수'를 '정렬 된 알고리즘'에서 찾는 방식이다. 

 

해당 문제는 정확히 원하는 값을 찾는 것이 아닌, '최소 값'을 만족하는 정답을 찾아야하기 때문에

단순 이분 탐색으로는 놓치는 케이스가 발생하기 마련이다. 

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#11724 연결 요소의 개수 (C++)  (0) 2020.09.16
#4963 섬의 개수 (C++)  (0) 2020.09.16
#1920번 수 찾기 (C++)  (0) 2020.05.22
#2960번 에라토스테네스의 체 (C++)  (0) 2020.05.20
#1463번 1로 만들기 (C++)  (0) 2020.05.20