[백준]#1477 휴게소 세우기

SeungBird·2020년 8월 30일
0

⌨알고리즘(백준)

목록 보기
156/401
post-custom-banner

문제

다솜이는 유료 고속도로를 가지고 있다. 다솜이는 현재 고속도로에 휴게소를 N개 가지고 있는데, 휴게소의 위치는 고속도로의 시작으로부터 얼만큼 떨어져 있는지로 주어진다. 다솜이는 지금 휴게소를 M개 더 세우려고 한다.

다솜이는 이미 휴게소가 있는 곳에 휴게소를 또 세울 수 없고, 고속도로의 끝에도 휴게소를 세울 수 없다.

다솜이는 이 고속도로를 이용할 때, 모든 휴게소를 방문한다. 다솜이는 휴게소를 M개 더 지어서 휴게소가 없는 구간의 길이의 최댓값을 최소로 하려고 한다. (반드시 M개를 모두 지어야 한다.)

예를 들어, 고속도로의 길이가 1000이고, 현재 휴게소가 {200, 701, 800}에 있고, 휴게소를 1개 더 세우려고 한다고 해보자.

일단, 지금 이 고속도로를 타고 달릴 때, 휴게소가 없는 구간의 최댓값은 200~701구간인 501이다. 하지만, 새로운 휴게소를 451구간에 짓게 되면, 최대가 251이 되어서 최소가 된다.

입력

첫째 줄에 현재 휴게소의 개수 N, 더 지으려고 하는 휴게소의 개수 M, 고속도로의 길이 L이 주어진다. N은 100보다 작거나 같으며, M도 100보다 작거나 같다. L은 100보다 크거나 같고, 1000보다 작거나 같다. 모든 휴게소의 위치는 중복되지 않으며, N+M은 L보다 작다. 둘째 줄에, 휴게소의 위치가 공백을 사이에 두고 주어진다.

출력

첫째 줄에 M개의 휴게소를 짓고 난 후에 휴게소가 없는 구간의 최댓값의 최솟값을 출력한다.

예제 입력 1

6 7 800
622 411 201 555 755 82

예제 출력 1

70

풀이

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

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        int N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);
        int L = Integer.parseInt(input[2]);
        int left = 0;
        int right = 0;

        int[] arr = new int[N+2];
        arr[0] = 0;
        arr[N+1] = L;

        input = br.readLine().split(" ");
        for(int i=1; i<=N; i++) {
            arr[i] = Integer.parseInt(input[i-1]);
        }
        Arrays.sort(arr);

        for(int i=1; i<=N+1; i++) {
            right = Math.max(right, arr[i]-arr[i-1]+1);
        }

        while(left<=right) {
            int mid = (left+right)/2;
            int sum = 0;

            for(int i=1; i<N+2; i++) {
                if(arr[i]>arr[i-1])
                    sum += (arr[i]-arr[i-1]-1)/mid;
            }

            if(sum>M)
                left = mid+1;
            else
                right = mid-1;
        }

        System.out.println(left);
    }
}
profile
👶🏻Jr. Programmer
post-custom-banner

0개의 댓글