티스토리 뷰

알고리즘/백준

백준 2110 (공유기 설치) - java

김다미김태리신시아 2023. 5. 24. 19:06

 

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

가능한 거리에 대해 이진탐색을 통해 해결하는 문제이다. 개인적으로 집(주어지는 값)에 대해 이분 탐색을 수행하는 방법을 고려했으나 해결법이 생각나지 않았다. 가능한 거리에 대해 이진탐색을 수행한다면 O(NlogN)안에 문제를 해결할 수 있다.

/*
*   백준 2110 (공유기 설치)
*   이분 탐색 : 기준이 뭘까?
*   기준 : 거리
* */
import java.io.*;
import java.util.*;
public class Main {
    static int n = 0;
    static int m = 0;

    static int result = 0;
    static int[] board;
    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());
        board = new int[n];
        m = Integer.parseInt(st.nextToken());
        for(int i=0;i<n;i++)
        {
            board[i] = Integer.parseInt(br.readLine());
        }

        Arrays.sort(board);
        bs(1,board[n-1] - board[0]); // 가능한 거리의 최솟값 , 최댓값
        System.out.println(result);
        br.close();
    }

    static void bs(int left,int right)
    {
        while(left <= right)
        {
            int mid = (left + right) / 2;

            int count = 1;
            int idx = 0;
            for(int i=1;i<n;i++)
            {
                if(board[i] >= board[idx] + mid)
                {
                    count = count +1;
                    idx = i;
                } // 해당 거리마다 공유기를 설치

                if(count==m)
                    break;
            }
            
            // 조건을 만족하는 경우 , 결과값이 최댓값일 경우 갱신 , 하한 조정
            if(count >= m)
            {
                if(result < mid)
                    result = mid;
                left = mid + 1;
            }
            // 더 적은 개수일 경우 상한을 조정
            else{
                right = mid -1;
            }
        }


    }
}

'알고리즘 > 백준' 카테고리의 다른 글

백준 3151 (합이 0) - java  (0) 2023.05.30
백준 1079 (마피아) - java  (0) 2023.05.29
백준 2467 (용액) - java  (0) 2023.05.22
백준 1253 (좋다) - java  (0) 2023.05.21
백준 2234 (성곽) - java  (0) 2023.05.16