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