도현이의 집 N개가 수직선 위에 있다. 각각의 집의 좌표는 x1, ..., xN이고, 집 여러개가 같은 좌표를 가지는 일은 없다.
도현이는 언제 어디서나 와이파이를 즐기기 위해서 집에 공유기 C개를 설치하려고 한다. 최대한 많은 곳에서 와이파이를 사용하려고 하기 때문에, 한 집에는 공유기를 하나만 설치할 수 있고, 가장 인접한 두 공유기 사이의 거리를 가능한 크게 하여 설치하려고 한다.
C개의 공유기를 N개의 집에 적당히 설치해서, 가장 인접한 두 공유기 사이의 거리를 최대로 하는 프로그램을 작성하시오.
아직 완벽하게 이해는 못 했다.
💡 21.08.06 추가
value + mid
값이 house[i]
값보다 작으면 공유기를 설치한다.value
: 현재 위치, mid
: 공유기 설치 거리이 과정에서 최대거리를 갱신한다.
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> houses;
int main() {
int n, c;
cin >> n >> c;
for (int i = 0; i < n; i++) {
int house;
cin >> house;
houses.push_back(house);
}
sort(houses.begin(), houses.end());
int start = 1;
int end = houses[n - 1] - houses[0];
int result = 0;
while (start <= end) {
int mid = (end + start) / 2;
int cnt = 1;
int value = houses[0];
for (int i = 0; i < n; i++) {
if (value + mid <= houses[i]) {
value = houses[i];
cnt++;
}
}
if (cnt >= c) {
result = mid;
start = mid + 1;
}
else end = mid - 1;
}
cout << result << endl;
}