< 이건 풀이 해설 보면서 알게 된 내용 >
int 배열의 수들 중 가장 큰 값은 stream을 이용해서도 구할 수 있다.
import java.util.stream.*;
int[] budgets;
int max = IntStream.of(budgets).max().orElse(0); // 값이 없으면 0 사용
int 배열의 수들의 총 합을 구하는 것도 stream을 이용하여 구할 수 있다.
// stream을 사용할 때 function 안에서 사용된 변수는 가변 변수를 사용하면 안되니까 final 붙여줌
final int mid = (min + max) / 2;
IntStream.of(budgets)
.map(b -> Math.min(b, mid))
.sum();
풀이 언어 : JAVA
import java.util.*;
class Solution {
public boolean isInBudget(int[] budgets, int M, int i, int sum) {
// i번째 수 까지의 합이 sum
int n = budgets.length;
int result = sum + budgets[i]*(n-i-1);
if(result <= M)
return true;
else
return false;
}
public int solution(int[] budgets, int M) {
int answer = 0;
int[] budgets_sum = new int[budgets.length];
Arrays.sort(budgets);
int sum=0;
int idx = 0;
for(int b : budgets) {
sum += b;
budgets_sum[idx++] = sum;
}
int n = budgets.length;
int lo = 0, hi = n-1;
while(lo<=hi) {
int mid = (lo+hi)/2;
if(isInBudget(budgets, M, mid, budgets_sum[mid])) {
if(mid+1 < n && !isInBudget(budgets, M, mid+1, budgets_sum[mid+1])) {
// 답은 mid와 mid+1 사이에 있음
answer = (M - budgets_sum[mid]) / (n - mid - 1);
break;
}else if (mid+1 == n){
answer = budgets[n-1];
break;
}else {
lo = mid+1;
}
}else {
hi = mid-1;
}
}
if(hi < 0) {
// 가장 작은 수 보다 적은 상한이 필요하면
answer = M/n;
}
return answer;
}
}