코딩 테스트/알고리즘
[백준] 2343 기타 레슨(Silver.1) - 이진 탐색(Binary search)
토자맨
2024. 8. 28. 04:51
문제
문제 해설
- low, high, mid 크기 설정
- 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);
}
}