코딩 테스트/이진 탐색 문제
미완성)이진탐색 문제 - 주어진 배열의 값을 범위 계산해서 (도메인 값으로 바꿔서) 이진탐색하는 문제 - 2
꾸준함의 미더덕
2024. 6. 13. 19:39
정수형 배열 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
}
}