정수형 배열 nums 와 정수 m 이 주어졌다.
nums 에는 양의 정수 값들이 들어 있고, m 은 배열을 부분 배열로 분리할 수 있는 수이다.
nums 배열을 m 개의 부분 배열로 분리할 때,
각 부분 배열의 합중 가장 큰 값이 최소가 되도록 분리했을 때의 합을 출력하세요.
입출력 예시
nums: 7, 2, 5, 10, 8
m: 2
출력: 18
nums: 1, 2, 3, 4, 5
m: 2
출력: 9
public class Main {
public static int solution(int[] nums, int m) {
int left = 0;
int right = 0;
for (int n : nums) {
left = Math.max(n, left);
right += n;
}
while (left <= right) {
int mid = (left + right) / 2;
int cur = 0;
int cnt = 1;
for (int n : nums) {
if (cur + n > mid) {
cnt++;
cur = 0;
}
cur += n;
}
if (cnt > m) {// cnt가(부분배열이) 크다 -> mid가 작다 -> mid 키우기
left = mid + 1;
} else { //cnt가(부분배열이) 같거나 작다 -> mid가 크다 -> mid 줄이기
right = mid - 1;
}
}
return left;
}
public static void main(String[] args) {
// Test code
int[] nums = {7, 2, 5, 10, 8};
System.out.println(solution(nums, 2)); // 18
nums = new int[]{1, 2, 3, 4, 5};
System.out.println(solution(nums, 2)); // 9
nums = new int[]{1, 4, 4};
System.out.println(solution(nums, 3)); // 4
}
}
'코딩 테스트 > 이진 탐색 문제' 카테고리의 다른 글
이진탐색 문제 - 주어진 배열의 값을 범위 계산해서 (도메인 값으로 바꿔서) 이진탐색하는 문제 - 1 (2) | 2024.06.12 |
---|---|
이진탐색 문제 - 2차원 행렬에서의 이진 탐색 (2차원 배열을 1차원 배열의 인덱스로 처리하기) (0) | 2024.06.10 |
이진탐색 문제 - 원형 정렬 상태의 배열에서 이진탐색 (0) | 2024.06.05 |
이진탐색 문제 - 존재하지 않는 값이 있어야 할 위치 구하기 (0) | 2024.06.05 |