변경할(최적화 할) 값 x에 대하여 f(x)가 단조 증가 혹은 단조 감소
https://www.acmicpc.net/problem/2512
let fs = require("fs");
let input = fs.readFileSync("dev/stdin").toString().split("\n");
let n = Number(input[0].split(" ")[0]); //지방의 갯수
let arr = input[1].split(" ").map(Number); // 지방의 예산요청
let m = Number(input[2]); // 총 예산
// 이진 탐색을 위한 시작점(start)과 끝점(end) 설정
let start = 1;
let end = arr.reduce((a, b) => Math.max(a, b));
let result = 0;
// 이진 탐색 수행(반복문)
while (start <= end) {
let mid = parseInt((start + end) / 2);
let total = 0; // 배정된 예산의 총액 계산
for (x of arr) {
// 각 지방에서 요청한 예산을 하나씩 확인하며
total += Math.min(mid, x); // 예산 배정
}
if (total <= m) {
// 조건 만족 -> 상한액 증가
result = mid;
start = mid + 1;
} else {
// 조건 만족 X -> 상한액 감소
end = mid - 1;
}
}
console.log(result);