
내가 생각했을때 문제에서 원하는부분
첫째 줄에 강의의 수 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; // 나눌 수 있음
}
}
코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.