코딩문제풀이/Baekjoon

[Java] 백준 2110번 : 공유기 설치

코딩하는 포메라니안 2022. 12. 7. 21:03

1. 문제

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

 

 

2. 풀이과정

집의 좌표가 10억이므로, 전체를 둘러보면 시간초과가 발생하므로 이진탐색을 택했다.

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

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String inputs[] = br.readLine().split(" ");
        int N = Integer.parseInt(inputs[0]);
        int C = Integer.parseInt(inputs[1]);
        int pos[] = new int[N];

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

        Arrays.sort(pos);
        int l = 0, r = pos[N-1];
        while(l<=r){
            int m = (l+r)/2;
            int pre = pos[0], cnt = 1;
            for(int i=1; i<N; i++){
                if(pos[i]-pre >= m){
                    cnt++;
                    pre = pos[i];
                }
            }

            if(cnt < C){r = m-1;}
            else{l = m+1;}
        }
        System.out.println(r);
    }
}

 

 

결과