반응형
[문제]
도현이의 집 N개가 수직선 위에 있다. 각각의 집의 좌표는 x1, ..., xN이고, 집 여러개가 같은 좌표를 가지는 일은 없다.
도현이는 언제 어디서나 와이파이를 즐기기 위해서 집에 공유기 C개를 설치하려고 한다. 최대한 많은 곳에서 와이파이를 사용하려고 하기 때문에, 한 집에는 공유기를 하나만 설치할 수 있고, 가장 인접한 두 공유기 사이의 거리를 가능한 크게 하여 설치하려고 한다.
C개의 공유기를 N개의 집에 적당히 설치해서, 가장 인접한 두 공유기 사이의 거리를 최대로 하는 프로그램을 작성하시오.
[소스 코드]
#include <iostream>
#include <algorithm>
using namespace std;
int N, C;
int x[200000];
int main()
{
//
// 문제
// 1. C개의 공유기를 N개의 집에 적당히 설치해서, 가장 인접한 두 공유기 사이의 거리를
// 최대로 하는 프로그램을 작성하시오.
// 입력
// 1. 집의 개수 N과 공유기 개수 C를 입력 받는다. (나눗셈 사용)
// 처리
// 2. 공유기 개수만큼
// 출력
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
//1.집의 개수와 공유기의 개수를 입력 받는다.
cin >> N >> C;
//2. 집의 좌표를 입력 받는다.
for (int i = 0; i < N; i++)
{
cin >> x[i];
}
//3. 공유기 사이의 거리를 구하기 위해 집의 좌표를 정렬한다.
sort(x, x + N);
//4.이진 검색을 할 범위는 가장 인접한 공유기 사이의 거리
// [1, x[N - 1]] (최소 거리 1, 최대 거리 x[N - 1])
int s = 1; // 0 ~ 1 , 1 ~ 2
int e = x[N - 1] + 1; // 0 ~ 9
int result = 0;
while (s < e)
{
// 4-1. 중앙값을 해의 후보로 정한다.
//s : 1, e : 10, m : 5
int m = (s + e) / 2; //공유기 거리
//4-2. 실제로 m거리 만큼 떨어뜨려 몇개의 공유기를 배치할수 있는지 확인한다.
int count = 1;
int distance = x[0] + m;
for (int i = 0; i < N; i++)
{
if (distance <= x[i])
{
distance = x[i] + m;
count++;
}
}
if (count >= C)
{
//4-3. 최대 길이 최신화
if (result < m)
{
result = m;
}
//4-4. 더 찾을수 있는지 범위 조절
s = m + 1;
}
else
{
e = m;
}
}
//4. 최대 거리를 출력한다.
cout << result;
}
[피드백]
반응형
'알고리즘' 카테고리의 다른 글
[백준 알고리즘 c++] 문제 39.미로 탐색 2178 (0) | 2022.09.04 |
---|---|
[백준 알고리즘 c++] 문제 38.유기농 배추 1012 (0) | 2022.09.04 |
[백준 알고리즘 c++] 문제 33.랜선 자르기 2805 (0) | 2022.09.03 |
[백준 알고리즘 c++] 문제 32.덩치 7568 (0) | 2022.09.03 |
[백준 알고리즘 c++] 문제 31.분해합 2231 (0) | 2022.09.03 |