728x90
https://www.acmicpc.net/problem/2613
728x90
메모리: 14,632 KB , 시간: 144 ms
사용 알고리즘: 이분 탐색, 매개 변수 탐색
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int[] arr = new int[N];
int max = 0;
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
max = Math.max(max, arr[i]);
}
// 이분 탐색
int result = 30_001;
ArrayList<Integer> list, resultList = new ArrayList<>();
int count, sum, idx, len;
int s = max, e = 30_000, m;
while(s <= e) {
m = (s + e) / 2;
// 합이 m 이하가 되도록 그룹을 나눴을 때, 그룹의 수가 M개 이하인지 확인
list = new ArrayList<>();
count = 1; idx = 0;
sum = 0; len = 0;
while(idx < N) {
if(sum + arr[idx] > m) {
list.add(len);
len = 1;
sum = arr[idx];
count++;
}
else {
sum += arr[idx];
len++;
}
if(count > M) break;
idx++;
}
list.add(len);
if(count == M) {
result = m;
resultList = list;
e = m - 1;
}
else if(count < M) {
result = m;
resultList = list;
for (int i = 0; i < list.size(); i++) {
while(list.get(i) > 1 && count < M) {
list.set(i, list.get(i) - 1);
list.add(i + 1, 1);
count++;
}
if(count == M) break;
}
e = m - 1;
}
else {
s = m + 1;
}
}
StringBuilder answer = new StringBuilder();
answer.append(result + "\n");
for (int i = 0; i < resultList.size(); i++) {
answer.append(resultList.get(i) + " ");
}
System.out.println(answer);
}
}
728x90
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 1561] 놀이 공원 (java) (0) | 2024.05.02 |
---|---|
[백준, BOJ 2624] 동전 바꿔주기 (java) (0) | 2024.04.30 |
[백준, BOJ 5557] 1학년 (java) (0) | 2024.04.19 |
[백준, BOJ 1414] 불우이웃돕기 (java) (0) | 2024.04.19 |
[백준, BOJ 16434] 드래곤 앤 던전 (java) (1) | 2024.04.19 |