https://www.acmicpc.net/problem/2110
목적
N개의 집 중에서, C개의 집에만 와이파이를 설치했을 때, 인접한 두 공유기의 거리를 최소로 만들자.
접근법
1. 이분 탐색 알고리즘을 이용하여 인접한 공유기의 최소 거리를 결정해 나간다.
- 가장 처음에 left는 1(가능한 최소 거리), right는 9(가능한 최대 거리)로 하여, 이분 탐색할 범위를 정한다. left와 right의 중간 값인 5를 최소 거리로 정한 후, 5이상의 간격으로 공유기 3개를 설치할 수 있는지 확인한다.
- 확인 후에는 범위를 좁혀야 하는데, 설치 가능 여부에 따라 중간 값을 기준으로 왼쪽, 오른쪽으로 범위를 갱신한다.
- 이런 과정을 left가 right보다 커질 때까지 반복하자.
2. 공유기 설치 가능 여부를 확인하기 위해서는 집의 좌표가 저장된 배열을 정렬된 형태로 사용해야한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#include<iostream>
#include<algorithm>
using namespace std;
int n,c,a[(int)2e5+1];
bool isPossible(int dist){
int prev=a[0],cnt=c-1;
for(int i=1;i<n;++i){
if(a[i]-prev>=dist){
prev=a[i];
--cnt;
if(cnt==0)return true;
}
}
return cnt==0;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin>>n>>c;
for(int i=0;i<n;++i)cin>>a[i];
sort(a,a+n);
int left=1,right=a[n-1];
while(left<=right){
int mid=(left+right)/2;
if(isPossible(mid))left=mid+1;
else right=mid-1;
}
cout<<right;
}
|
문제 설명과 코드에 대한 피드백은 언제나 환영합니다.
다양한 의견 댓글로 남겨주세요.
'Problem Solving > BOJ 백준' 카테고리의 다른 글
[ BOJ 백준 6073번 - Secret Message ] 해설 및 코드 (2) | 2019.12.13 |
---|---|
[ BOJ 백준 2343번 - 기타 레슨 ] 해설 및 코드 (0) | 2019.12.12 |
[ BOJ 백준 5052번 - 전화번호 목록 ] 해설 및 코드 (0) | 2019.12.11 |
[ BOJ 백준 4358번 - 생태학 ] 해설 및 코드 (0) | 2019.12.11 |
[ BOJ 백준 2842번 - 집배원 한상덕 ] 해설 및 코드 (2) | 2019.12.10 |