ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]1477: 휴게소 세우기(java)
    Algorithm/백준 2022. 6. 1. 18:02
    728x90

    https://www.acmicpc.net/problem/1477

     

    1477번: 휴게소 세우기

    첫째 줄에 현재 휴게소의 개수 N, 더 지으려고 하는 휴게소의 개수 M, 고속도로의 길이 L이 주어진다. 둘째 줄에 현재 휴게소의 위치가 공백을 사이에 두고 주어진다.

    www.acmicpc.net

    문제

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

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

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

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

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

    입력

    첫째 줄에 현재 휴게소의 개수 N, 더 지으려고 하는 휴게소의 개수 M, 고속도로의 길이 L이 주어진다. 둘째 줄에 현재 휴게소의 위치가 공백을 사이에 두고 주어진다.

    출력

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

    제한

    • 0 ≤ N ≤ 50
    • 1 ≤ M ≤ 100
    • 100 ≤ L ≤ 1,000
    • 1 ≤ 휴게소의 위치 ≤ L-1
    • N+M < L
    • 모든 휴게소의 위치는 중복되지 않음
    • 입력으로 주어지는 모든 수는 정수

    예제 입력 1 

    6 7 800
    622 411 201 555 755 82
    

    예제 출력 1 

    70

    풀이

    전체 코드

    package 백준;
    
    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    import java.util.Arrays;
    import java.util.Collections;
    import java.util.StringTokenizer;
    
    public class BJ_G4_1477_휴게소 {
        public static void main(String[] args) throws Exception{
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringTokenizer st = new StringTokenizer(br.readLine());
    
            int N = Integer.parseInt(st.nextToken());
            int M = Integer.parseInt(st.nextToken());
            int L = Integer.parseInt(st.nextToken());
            st = new StringTokenizer(br.readLine());
            int[]arr = new int[N+2];
    
            arr[0] = 0;
            for(int i=1; i<=N; i++) {
                arr[i] = Integer.parseInt(st.nextToken());
            }
            arr[N+1] = L;
            Arrays.sort(arr);
    
            int left = 1;
            int right = L-1;
    
            while(left <= right) {
                int mid = (left + right) / 2;
                int sum = 0;
    
                for(int i=1; i<arr.length; i++) {
                    sum+=(arr[i] - arr[i-1] - 1) / mid;
                }
    
                if(sum > M) {
                    left = mid+1;
                } else {
                    right = mid-1;
                }
            }
            System.out.println(left);
        }
    }
    
    728x90

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

    [백준]13265: 색칠하기(java)  (0) 2022.06.05
    [백준]19542: 전단지 돌리기(java)  (0) 2022.06.04
    [백준]1826: 연료 채우기(java)  (0) 2022.05.31
    [백준]2026: 소풍(java)  (0) 2022.05.30
    [백준]8972: 미친 아두이노(java)  (0) 2022.05.19

    댓글

Designed by Tistory.