백준 14627 자바

손찬호·2024년 5월 17일
0

알고리즘

목록 보기
45/91

풀이 아이디어

구매한 파 길이를 입력받으면서 구매한 파의 총 길이를 구한다.
매개변수 탐색을 활용해 파의 길이를 middle로 가정하고
middle일 때 자를 수 있는 파의 개수를 구하며 파닭 수인 c를 만족하는지 확인한다.
이때 만족하는 파의 길이 중에서 최대 길이를 구한 뒤에
파닭에 넣고 남은 파의 길이를 구하자.

트러블슈팅 - divide by zero

채점 중 99%까지 맞았다가 런타임 에러 "/ by zero"가 발생했다.

쉽게 말해서 0으로 나눠서 에러가 발생했다는 건데
/ 연산을 하는데 0으로 나눠질만한 부분이 "count += arr[i]/middle;"인 부분이다.
즉 middle이 0이 될 수 있다는 건데
어떻게 해결할까하다가 길이가 mid는 파닭 하나당 넣을 수 있는 최대 길이의 후보이므로
S(1 ≤ S ≤ 1,000,000)이므로 길이는 최소 1이된다.
처음에 0으로 주니 middle이 0이 되는 경우가 발생해서 오류가 발생했던 것이다.
그래서 left=1로 바꾸니 문제가 해결되었다.

풀이 코드

import java.util.*;
import java.io.*;

public class _14627 {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");
        int s = Integer.parseInt(st.nextToken()); // 사온 파의 개수
        int c = Integer.parseInt(st.nextToken()); // 주문받은 파닭 수

        int[] arr = new int[s];
        long sumLength = 0;
        for(int i=0; i<s; i++){
            arr[i] = Integer.parseInt(br.readLine());
            sumLength += arr[i];
        }
        Arrays.sort(arr); // 내림차순 정렬

        // 자르고자 하는 파의 길이를 middle로 설정
        long left = 1;
        long right = arr[s-1];
        long answer = 0;
        
        // 길이가 middle일 때 자를 수 있는 파의 개수를 구함
        while(left<=right){
            long middle = (left+right)/2;
            if(get_piece(arr, middle)>=c){
                answer = middle;
                left = middle+1;
            }else{
                right = middle-1;
            }
        }

        System.out.println(sumLength - answer*c);   
    }

    static long get_piece(int[] arr, long middle){
        int count = 0;
        for(int i=0; i<arr.length; i++){
            count += arr[i]/middle;
        }
        return count;
    }
}
profile
매일 1%씩 성장하려는 주니어 개발자입니다.

0개의 댓글

관련 채용 정보