https://www.acmicpc.net/problem/2110
2110번: 공유기 설치
첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집의 좌표를 나타내는 xi (0 ≤ xi ≤ 1,000,000,000)가
www.acmicpc.net
- 도현이의 집 N개가 수직선 위에 있다. 각각의 집의 좌표는 x1, ... ,Xn이고, 집 여러개가 같은 좌표를 가지는 일은 없다.
- 도현이는 언제 어디서나 와이파이를 즐기기 위해서 집에 공유기 C개를 설치하려고 한다. 최대한 많은 곳에서 와이파이를 사용하려고 하기 때문에, 한 집에는 공유기를 하나만 설치할 수 있고, 가장 인접한 두 공유기 사이의 거리를 가능한 크게 하여 설치하려고 한다.
- C개의 공유기를 N개의 집에 적당히 설치해서, 가장 인접한 두 공유가 사이의 거리를 최대로 하는 프로그램
문제 풀이
[백준] 2110번 : 공유기 설치 - JAVA [자바] (tistory.com)
[백준] 2110번 : 공유기 설치 - JAVA [자바]
https://www.acmicpc.net/problem/2110 2110번: 공유기 설치 첫째 줄에 집의 개수 N (2 ≤ N ≤ 200,000)과 공유기의 개수 C (2 ≤ C ≤ N)이 하나 이상의 빈 칸을 사이에 두고 주어진다. 둘째 줄부터 N개의 줄에는 집
st-lab.tistory.com
- 문제에서 주어지는 '설치 해야 할 공유기의 개수(M)'와 같은 거리 중 최대로 가질 수 있는 '최소 거리'를 찾는 것
- 이전 집과의 거리가 아닌, 직전에 설치를 했던(가장 최근에 설치했던) 집과 현재 집과의 거리를 기준으로 판단해야 함
- 거리를 '줄이면' 설치 가능한 공유기 대수가 늘어나고, 거리를 '늘리면' 설치 가능한 공유기 대수가 줄어듬
0 즉, canInstall 메소드를 통해 얻은 공유기 대수가 M보다 작다면, 거리가 너무 길어서 설치 가능한 대수가 작다는 것
- 그렇기 때문에 hi를 줄이는 것이고, 반대로 M보다 크거나 같다면 거리가 작다는 의미이므로 lo를 좁히는 것
정답
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Arrays;
public class Main
{
static int N,M;
static int house[];
static int max,min,mid;
public static void main(String[] args) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M= Integer.parseInt(st.nextToken());
house = new int[N];
for(int i=0; i<N; i++)
{
house[i] = Integer.parseInt(br.readLine());
}
Arrays.sort(house);
min = 1; //최소 거리가 가질 수 있는 최솟값
max = house[N-1]- house[0]+1; //최소 거리가 가질 수 있는 최댓값
while(min<max)
{
mid = (min+max)/2;
//mid 거리에 대해 설치 가능한 공유기 개수가 M 개수에 못미치면
//거리를 좁혀야 하기 때문에 max를 줄임
if(canInstall(mid) < M)
{
max = mid;
}
else
{
//설치 가능한 공유기 개수가 M 개수보다 크거나 같으면
//거리를 벌리면서 최소거리가 가질 수 있는 최대거리를 찾아냄ㄴ
min = mid+1;
}
}
System.out.println(min-1);
}
//distance에 대해 설치 가능한 공유기 개수를 찾는 메소드
static int canInstall(int distance)
{
//첫 번째 집은 무조건 설치한다고 가정
int count = 1;
int lastLocate = house[0];
for(int i=1; i<house.length; i++)
{
int locate = house[i];
/*
현재 탐색하는 집의 위치와 직전에 설치했던 집의 위치간 거리가
최소 거리(distance)보다 크거나 같을 때 공유기 설치 개수가 늘려주고
마지막 설치 위치를 갱신해준다.
*/
if(locate - lastLocate >=distance)
{
count++;
lastLocate = locate;
}
}
return count;
}
}
'Java > 백준' 카테고리의 다른 글
[JAVA] 백준 11279 최대 힙 (0) | 2024.03.15 |
---|---|
[JAVA] 백준 1300 K번째 수 (0) | 2024.03.13 |
[JAVA] 백준 2805 나무 자르기 (0) | 2024.03.12 |
[JAVA] 백준 1654 랜선 자르기 (0) | 2024.03.12 |
[JAVA] 백준 2740 행렬 곱셈 (0) | 2024.03.08 |