⭐️ 이분 탐색 풀이
⭐️ 구간 점수의 최댓값을 이분 탐색
left = 0
, right = 입력 받은 숫자 중 최대값
right = mid - 1
으로 구간점수의 범위를 mid 이전으로 설정left = mid + 1
으로 구간점수의 범위를 mid 이후로 설정#include <iostream>
#include <vector>
using namespace std;
int main() {
int n,m;
cin>>n>>m;
vector<int> v(n);
int mx=0;
for(int i=0;i<n;i++) {
cin >> v[i];
mx=max(mx,v[i]);
}
int left=0,right=mx,ans=100001;
while(left<=right) {
int mid=(left+right)/2;
int mn=v[0],cnt=1;
mx=v[0];
for(int i=1;i<n;i++) {
mn=min(mn,v[i]);
mx=max(mx,v[i]);
// 구간 점수가 mid 보다 크면 구간 count -> 현재 인덱스부터 새로운 구간 시작하는 것
if(mx-mn>mid) {
cnt++;
// 현재 구간부터 새로운 구간 시작하기 때문에 최대, 최소값 초기화
mn=v[i];
mx=v[i];
}
}
if(cnt<=m) {
ans=min(ans,mid); // 구간점수 최소값으로 갱신
right=mid-1;
}
else left=mid+1;
}
cout << ans << endl;
}