![[java] 백준 2343번 문제(기타 레슨)](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcK9d6F%2FbtsM3TtmLpO%2FKlLPT8tsKhIiEdRIoJ9PYK%2Fimg.png)
[java] 백준 2343번 문제(기타 레슨)자료구조 & 알고리즘/BOJ2025. 4. 2. 10:53
Table of Contents
원본 링크 : https://www.acmicpc.net/problem/2343
문제설명
소스코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Boj_2343
{
static int N, M;
static int[] lesson;
static int left, right;
public static void main(String[] args) throws IOException
{
BufferedReader br =new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
lesson = new int[N];
st = new StringTokenizer(br.readLine());
int sum = 0;
for (int i = 0; i < N; ++i)
{
lesson[i] = Integer.parseInt(st.nextToken());
sum += lesson[i];
left = Math.max(left, lesson[i]);
}
right = sum;
System.out.println(binarySearch(left,right));
}
public static long binarySearch(long leftPtr, long rightPtr)
{
while(leftPtr <= rightPtr)
{
long sum = 0;
long mid = (leftPtr + rightPtr) / 2;
int count = 1;
for (int i = 0; i < N; ++i)
{
sum += lesson[i];
if(sum > mid)
{
sum = lesson[i]; // 새 블루레이 시작
++count; // 블루레이 개수 증가
}
}
if(count <= M) rightPtr = mid - 1; //필요한 블루레이 갯수가 M보다 작거나 같으면
else leftPtr = mid + 1; //총 필요한 블루레이 개수가 M보다 크다면
}
return leftPtr;
}
}
설명
- 이진 탐색의 시작 인덱스는 최대 길이의 레슨이고 종료 인덱스는 모든 레슨 길이의 합이다.
- 총 9개로 구성된 레슨의 시간은 각각 1, 2, 3, 4, 5, 6, 7, 8, 9이므로 이진 탐색의 시작 인덱스는 최대 레슨 시간인 9, 종료 인덱스는 레슨 시간을 모두 합한 45이다.
- 블루레이 개수가 3일 때 9~45 사이에서 블루레이 크기의 최소값을 이진 탐색으로 찾으면 된다.
- 9~45 사이에서 이진 탐색을 아래와 같이 수행한다. 이진 탐색은 leftPtr > rightPtr 일 때까지 수행한다.
- mid 크기로 모든 레슨을 저장할 수 있으면 rightPtr = mid - 1
- mid 크기로 모든 레슨을 저장할 수 없으면 lefgPtr = mid + 1
... 이하 과정 생략
'자료구조 & 알고리즘 > BOJ' 카테고리의 다른 글
[java] 백준 1744번 문제(수 묶기) (0) | 2025.04.07 |
---|---|
[java] 백준 1300번 문제(K번째 수) (0) | 2025.04.03 |
[java] 백준 1167번 문제(트리의 지름) (0) | 2025.03.31 |
[java] 백준 2178번 문제(미로 탐색) (0) | 2025.03.29 |
[java] 백준 13023번 문제(ABCDE) (0) | 2025.03.27 |