코딩 테스트/알고리즘

[백준] 2343 기타 레슨(Silver.1) - 이진 탐색(Binary search)

토자맨 2024. 8. 28. 04:51

문제

문제 해설

  • low, high, mid 크기 설정
    • low와 high는 최소 블루레이 크기와 최대 블루레이 크기(모든 동영상 크기의 합)으로 설정한다.
    • mid는 블루레이 크기로 설정한다.
  • 풀이 방법
    1. 동영상을 순회하며 블루레이 크기(mid)로 동영상을 나누어 담아 나온 블루레이 개수를 저장한다.
    2. 계산되어 나온 블루레이 개수 <= 목표 블루레이 개수: 블루레이 크기의 최솟값을 구해야 하기 때문에 왼쪽을 탐색(high = mid - 1)한다.
    3. 계산되어 나온 블루레이 개수 > 목표 블루레이 개수: 오른쪽을 탐색(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);
    }
}