ALGORITHM

[JAVA] 백준 2110 - 공유기 설치

연듀 2022. 12. 29. 11:20

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

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;

public class Main{
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int n = Integer.parseInt(st.nextToken()); // 집의 개수
        int c = Integer.parseInt(st.nextToken()); // 공유기의 개수

        int[] arr = new int[n];

        for(int i=0; i<n; i++){
            arr[i] = Integer.parseInt(br.readLine());
        }

        Arrays.sort(arr);

        int left = 1; // 가능한 최소 거리
        int right = arr[n-1] - arr[0]; // 가능한 최대 거리
        int answer = 0;

        while(left<=right){
            int mid = (left+right) / 2; // 기준 간격
            int start = arr[0];

            int cnt = 1; // 공유기 개수
            for(int i=1; i<n; i++){ // 기준 간격으로 공유기 설치
                int gap = arr[i] - start;
                if(gap >= mid){
                    cnt++;
                    start = arr[i];
                }
            }
            if(cnt >= c){ // 설치해야할 공유기 개수보다 많이 설치함 -> 최대 거리 찾기 위해 거리를 늘림
                answer = mid;
                left = mid + 1;
            }else{ // 적게 설치함 -> 거리를 줄임
                right = mid - 1;
            }
        }
        System.out.println(answer);
    }
}

 

 

집의 좌표가 최대 10억이 될 수 있다. 이분탐색으로 풀어야 한다.

 

 

 

일단 가장 왼쪽 집부터 공유기를 설치해야 최대한 멀게 설치할 수 있다. 

 

 

가장 인접한 두 공유기 사이의 거리를 mid라고 하고 공유기를 설치해보자.

mid = 2 이면,

1, 4, 8 이렇게 3개를 설치할 수 있다 -> 가능

 

mid = 5 면,

1, 8 두개를 설치 할 수 있다.  -> 불가능 

 

mid = 3 이면,

1, 4, 8 이렇게 3개를 설치할 수 있다. -> 가능 

 

 

거리가 2일때와 3일 때 둘다 가능하지만, 우리가 구하고자 하는거는 최대 거리이므로 답은 3이 된다.

 

 

 

 

=> 공유기 사이 거리를 mid로 설정하고, mid를 기준으로 공유기를 설치한다.

공유기를 C개 이상 설치 할 수 있다면 mid를 늘려나가며 최댓값을 확인하고,

설치할 수 있는 공유기 개수가 C개 미만이면 mid를 줄여나간다. 

 

 

'ALGORITHM' 카테고리의 다른 글

[JAVA] 백준 2512 - 예산  (0) 2022.12.30
[JAVA] 백준 2343 - 기타 레슨  (0) 2022.12.29
[JAVA] 백준 1654 - 랜선 자르기  (0) 2022.12.26
[JAVA] 백준 2805 - 나무 자르기  (0) 2022.12.26
[JAVA] 백준 2146 - 다리 만들기  (0) 2022.12.23