알고리즘
- 이분 탐색
- 매개 변수 탐색

Upper Bound
어진 조건을 만족하는 가장 큰 값을 찾는 방법
이 문제에서는 랜선의 길이를 어떤 값으로 잘랐을 때 얻어지는 랜선의 개수가
주어진 필요한 랜선의 개수보다 작거나 같아야 하기 때문에 upper bound를 사용
Scanner in = new Scanner(System.in);
int K = in.nextInt();
int N = in.nextInt();
int[] arr = new int[K];
long max = 0;
// 입력 + max 갱신
for (int i = 0; i < K; i++) {
arr[i] = in.nextInt();
if(max < arr[i]) { max = arr[i]; }
}
// 반드시 max에서 +1 값이어야 함
max++;
long min = 0; // 탐색 길이의 최솟값
long mid = 0;
while (min < max) {
// 범위 내에서 중간 길이를 구함
mid = (max + min) / 2;
long count = 0;
// 구해진 중간 길이로 잘라서 총 랜선 개수 확인
// Upper bound 형식의 이분탐색 사용
// mid 길이로 잘랐을 때의 개수가 만들고자 하는 랜선의 개수보다 작다면 -> 자르고자 하는 길이를 줄이기 위해 최대 길이를 줄인다.
// 그 외에는 자르고자 하는 길이를 늘려야 하므로 최소 길이를 늘린다.
for (int i = 0; i < arr.length; i++) {
count += (arr[i] / mid);
}
if(count < N) { max = mid; }
else { min = mid + 1; }
}
// UpperBound로 얻어진 값(min) -1 -> 최대 길이
System.out.println(min - 1);
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int K = in.nextInt();
int N = in.nextInt();
int[] arr = new int[K];
long max = 0;
// 입력 + max 갱신
for (int i = 0; i < K; i++) {
arr[i] = in.nextInt();
if(max < arr[i]) { max = arr[i]; }
}
// 반드시 max에서 +1 값이어야 함
max++;
long min = 0; // 탐색 길이의 최솟값
long mid = 0;
while (min < max) {
// 범위 내에서 중간 길이를 구함
mid = (max + min) / 2;
long count = 0;
// 구해진 중간 길이로 잘라서 총 랜선 개수 확인
// Upper bound 형식의 이분탐색 사용
// mid 길이로 잘랐을 때의 개수가 만들고자 하는 랜선의 개수보다 작다면 -> 자르고자 하는 길이를 줄이기 위해 최대 길이를 줄인다.
// 그 외에는 자르고자 하는 길이를 늘려야 하므로 최소 길이를 늘린다.
for (int i = 0; i < arr.length; i++) {
count += (arr[i] / mid);
}
if(count < N) { max = mid; }
else { min = mid + 1; }
}
// UpperBound로 얻어진 값(min) -1 -> 최대 길이
System.out.println(min - 1);
}
}