백준 기타 레슨

KIMYEONGJUN·2025년 2월 12일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

첫째 줄에 강의의 수 N (1 ≤ N ≤ 100,000)과 M (1 ≤ M ≤ N)이 주어진다.
다음 줄에는 강토의 기타 강의의 길이가 강의 순서대로 분 단위로(자연수)로 주어진다.
각 강의의 길이는 10,000분을 넘지 않는다.

첫째 줄에 가능한 블루레이 크기중 최소를 출력한다.

내가 이 문제를 보고 생각해본 부분

입력 처리: 강의 수 N과 블루레이 수 M을 입력받고, 각 강의의 길이를 배열에 저장한다.
이분 탐색:
left는 강의 중 가장 긴 길이로 시작하고, right는 모든 강의를 합한 길이로 설정한다.
중간 값 mid를 계산하고, 이 값으로 강의를 M개의 블루레이에 나눌 수 있는지 확인해준다.
나눌 수 있다면, 더 작은 크기로 시도하고, 그렇지 않다면 더 큰 크기로 시도한다.
블루레이 나누기: canDivide 메소드는 주어진 최대 크기로 강의를 나눌 수 있는지 확인한다.
최종 결과 출력: 최종적으로 가능한 블루레이 크기 중 최소값을 출력한다.

코드로 구현

package baekjoon.baekjoon_26;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

// 백준 2343번 문제
public class Main930 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] input = br.readLine().split(" ");
        int N = Integer.parseInt(input[0]); // 강의의 수
        int M = Integer.parseInt(input[1]); // 블루레이의 수

        int[] lectures = new int[N];
        String[] lengths = br.readLine().split(" ");
        int maxLength = 0;
        int sumLength = 0;

        for(int i = 0; i < N; i++) {
            lectures[i] = Integer.parseInt(lengths[i]);
            sumLength += lectures[i];
            maxLength = Math.max(maxLength, lectures[i]);
        }

        // 이분 탐색 시작
        int left = maxLength; // 블루레이 크기의 최소값
        int right = sumLength; // 블루레이 크기의 최대값
        int answer = right;

        while(left <= right) {
            int mid = (left + right) / 2;
            if(canDivide(lectures, N, M, mid)) {
                answer = mid; // 가능한 경우, answer를 업데이트
                right = mid - 1; // 더 작은 크기로 시도
            } else {
                left = mid + 1; // 더 큰 크기로 시도
            }
        }

        System.out.println(answer);
        br.close();
    }

    // 강의를 블루레이에 나눌 수 있는지 확인하는 메소드
    static boolean canDivide(int[] lectures, int N, int M, int maxSize) {
        int count = 1; // 블루레이 개수
        int currentSize = 0;

        for(int i = 0; i < N; i++) {
            if(currentSize + lectures[i] > maxSize) {
                count++; // 새로운 블루레이 필요
                currentSize = lectures[i]; // 현재 강의로 초기화
                if(count > M) {
                    return false; // 블루레이 수 초과
                }
            } else {
                currentSize += lectures[i]; // 현재 블루레이에 추가
            }
        }

        return true; // 나눌 수 있음
    }
}

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글