#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 |