문제 링크 : 백준 2110번
거리가 작은 값부터 대입해보면서 공유기 개수가 맞을 때까지 모든 경우 수를 찾는 방법은 시간초과가 난다.
풀이 방법을 찾지 못해서 다른 사람 코드를 참고했는데 이분 탐색으로 풀리는 것 같다.
두 공유기 사이의 최소 거리는 1, 최대 거리는 양 끝 공유기이므로 arr[n-1]-arr[0]
이다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int n,c;
vector<int> arr;
bool check(int mid) {
int standard = arr[0];
int cnt=1;
for(int i=1 ; i<n ; i++) {
if(arr[i]-standard>=mid) {
cnt++;
standard = arr[i];
}
}
if(cnt>=c) return true;
else return false;
}
int main(){
cin >> n >> c;
for(int i=0 ; i<n ; i++) {
int a;
cin >> a;
arr.push_back(a);
}
sort(arr.begin(), arr.end());
int start = 1, end = arr[arr.size()-1]-arr[0]; // 최소 거리, 최대 거리
int ans=0;
while(start<=end) {
int mid = (start+end)/2;
if(check(mid)) start = mid+1;
else end = mid-1;
}
cout << start-1;
return 0;
}