low와 high는 최소 블루레이 크기와 최대 블루레이 크기(모든 동영상 크기의 합)으로 설정한다.
mid는 블루레이 크기로 설정한다.
풀이 방법
동영상을 순회하며 블루레이 크기(mid)로 동영상을 나누어 담아 나온 블루레이 개수를 저장한다.
계산되어 나온 블루레이 개수 <= 목표 블루레이 개수: 블루레이 크기의 최솟값을 구해야 하기 때문에 왼쪽을 탐색(high = mid - 1)한다.
계산되어 나온 블루레이 개수 > 목표 블루레이 개수: 오른쪽을 탐색(low = mid + 1)한다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class _2343_기타레슨 {
public static void main(String[] args) throws IOException {
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());
st = new StringTokenizer(br.readLine());
int[] lecs = new int[n];
for (int i = 0; i < n; i++)
lecs[i] = Integer.parseInt(st.nextToken());
int low = Arrays.stream(lecs).max().getAsInt();
int high = Arrays.stream(lecs).sum();
while (low <= high) {
int mid = (low+high) / 2;
int sum = 0;
int cnt = 1;
for (int lec : lecs) {
if (sum + lec <= mid) sum += lec;
else {
cnt += 1;
sum = lec;
}
}
if (cnt <= m) high = mid -1;
else low = mid + 1;
}
System.out.println(low);
}
}