⭐️ 이분 탐색 풀이
left = 0
, right= n - 1
mid 인덱스 위치 - left 인덱스 위치
와 right 인덱스 위치 - mid 인덱스 위치
중에 거리가 먼 영역을 이분탐색 영역으로 지정그냥 틀려버리는데 맞게 푼건지도 모르겠다..테케는 맞음
시도는 좋았으나 점점 산으로 감,,
⭐️ 이분 탐색 풀이
⭐️ 모든 공유기간 간격이 x 이상이면서 c 개의 공유기를 세울 수 있을 때 x 값 중에서 최대값을 구해야하는 것
⭐️ 결국 이분 탐색의 범위는 공유기간 거리가 되는 것
이전 공유기 위치와 현재 집의 거리(x[i]-first>=mid)
가 mid 보다 크거나 같으면 현재 집에 공유기를 세우고 공유기 개수 countleft = mid + 1
로 갱신하고 mid 를 ans 에 갱신right = mid - 1
로 갱신이분 탐색의 범위를 인덱스를 기준으로 보지 않고 전체 거리로 봐야 함
공유기 간 간격뿐만 아니라 공유기의 개수도 고려해줘야 했기 때문에 이를 어떻게 처리할지 고민하는 과정이 필요했음
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
int n,c;
cin >> n >> c;
vector<int> x(n);
for(int i=0;i<n;i++) {
cin >> x[i];
}
sort(x.begin(),x.end());
int left=1,right=x[n-1],ans=0;
while (left<=right) {
int cnt=1; // 첫번째 집에 1개 설치
int mid=(left+right)/2;
int first=x[0]; // 공유기 설치 위치
for(int i=1;i<x.size();i++) {
if(x[i]-first>=mid) {
first=x[i];
cnt++; // 공유기 count
}
}
if(cnt>=c) {
ans=mid;
left=mid+1;
}
else {
right=mid-1;
}
}
cout << ans << endl;
}