⭐️ 이분 탐색
right = m - 1
로 mid 앞 범위를 이어서 탐색하도록 조정left = m + 1
로 mid 뒷 범위를 이어서 탐색하도록 조정ans
에 저장이분 탐색을 무조건 두 범위로 나눠서 Mid 값과 대소비교하는 것으로 이해해서 풀이에 어려움 겪음
이분 탐색은 탐색 범위를 두 범위로 나눠서 탐색 범위를 좁혀나가며 정답에 근접해가는 방법임을 숙지하고 이분 탐색 유형 풀이가 더 필요
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
long long k,n;
cin >> k >> n;
long long mx=0;
vector<long long> v(k);
for(int i=0;i<k;i++) {
cin >> v[i];
mx=max(mx,v[i]);
}
sort(v.begin(),v.end());
long long l=1, r=mx,m,ans=0;
while(l<=r) {
m=(l+r)/2;
long long cnt=0;
for(int i=0;i<k;i++) {
cnt+=v[i]/m;
}
// 개수가 작으면 길이 범위를 더 줄여서 탐색하기 위해 Mid 값 앞으로 Right 를 옮겨줘서 Mid 앞 범위 탐색
if(cnt<n) r=m-1;
// 개수가 크면 Mid 값 앞으로 Left 를 옮겨줘서 Mid 뒤 범위 중에서 개수가 작아질 때까지 최대값을 정답에 갱신
else if(cnt>=n) {
l=m+1;
ans=max(ans,m);
}
}
cout << ans << endl;
}