ALGORITHM

[JAVA] 백준 1654 - 랜선 자르기

연듀 2022. 12. 26. 21:50

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

 

1654번: 랜선 자르기

첫째 줄에는 오영식이 이미 가지고 있는 랜선의 개수 K, 그리고 필요한 랜선의 개수 N이 입력된다. K는 1이상 10,000이하의 정수이고, N은 1이상 1,000,000이하의 정수이다. 그리고 항상 K ≦ N 이다. 그

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 k = Integer.parseInt(st.nextToken());
        int n = Integer.parseInt(st.nextToken());

        long[] arr = new long[k];
        for(int i=0; i<k; i++){
            arr[i] = Long.parseLong(br.readLine());
        }

        Arrays.sort(arr);

        long left = 1; // 랜선 길이는 자연수
        long right = arr[k-1];
        while(left<=right){
            long mid = (left+right)/2; // 자르는 길이
            int cnt = 0;
            for(long length : arr){
               cnt += length / mid;
            }
            if(cnt >= n){ // 자른 개수가 n보다 같거나 크면
                left = mid+1; // 자르는 길이를 더 크게 해줘야 함
            }else{ // 자른 개수가 n보다 작으면
                right = mid-1; // 자르는 길이를 더 작게 해줘야 함
            }
        }
        System.out.println(right);
    }
}

 

left 를 처음에 0으로 해서 런타임 에러가 떴다.

애초에 문제 조건을 보면 랜선 길이는 자연수기 때문에 0으로 시작하면 안되기도 하고,

만약에 right가 1인 경우

mid를 구할 때 (0+1)/2 = 0이 되어 length에서 0을 나누게 되어 런타임에러가 뜬것이였다.