https://www.acmicpc.net/problem/2343
글을 읽으면서 블루레이의 크기를 mid로 두고 조건을 만족하는 경우의 최솟값을 구하면 됨을 알 수 있었다.
조건은 calc 함수를 통해 arr을 순서대로 탐색하며 현재 블루레이 크기 mid인 경우 만들어지는 블루레이 개수 cnt 를 구해 비교해보면 된다.
이때, 블루레이 크기보다 강의의 크기가 커서 담기지 않는 경우를 꼭 고려해주어야 한다.
또한, 블루레이가 다 찬 경우 시작값에 현재 강의 시간을 잘 담아서 다시 계산해주어야 한다.
마지막으로, 블루레이 개수가 꼭 m과 같아야하는 것이 아닌 작을 때도 고려해서 최솟값을 갱신하면 된다!
start 값은 1 end 값은 총 강의 시간을 넘어가진 않을 것이므로, 총 강의 시간으로 설정했다.
package BOJ;
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 ans = Integer.MAX_VALUE;
static int[] arr;
public static boolean calc(int mid){
int sum = 0;
int cnt = 1;
for(int i=0; i<n; i++){
// 블루레이보다 한 강의의 크기가 커서 담기지 않는 경우
if(arr[i] > mid) return true;
// 블루레이가 다 찬 경우
if(sum + arr[i] > mid) {
cnt++;
sum = arr[i];
}else sum += arr[i];
}
// 블루레이 개수가 더 큰 경우
if(cnt > m) return true;
else {
ans = Math.min(ans, mid);
return false;
}
}
public static void binarySearch(int s, int e, int m){
if(s > e) return;
int mid = (s + e) / 2;
if(calc(mid)) binarySearch(mid+1, e, m);
else binarySearch(s, mid-1, m);
}
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());
arr = new int[n];
int end = 0;
st = new StringTokenizer(br.readLine());
for(int i=0; i<n; i++){
arr[i] = Integer.parseInt(st.nextToken());
end += arr[i]; // 총 강의 길이가 maximum
}
binarySearch(1, end, m);
System.out.println(ans);
}
}
'코테 > 백준' 카테고리의 다른 글
99클럽 코테 스터디 5일차 TIL BFS(알고리즘 수업 - 너비 우선 탐색 1) (0) | 2024.11.01 |
---|---|
99클럽 코테 스터디 4일차 TIL DFS(알고리즘 수업 - 깊이 우선 탐색 1) (0) | 2024.10.31 |
[BOJ] 2512 예산 (Java) (0) | 2024.10.29 |
99클럽 코테 스터디 2일차 TIL 이분탐색(징검다리) (0) | 2024.10.29 |
[BOJ] 2776 암기왕 (Java) (0) | 2024.10.28 |