파라메트릭 서치(이분탐색) 로 풀었다.
이분탐색 대상: 상한액 (1 ~ 최대 요청액)
조건: 상한액 mid로 지급했을 때 총합이 M 이하인가?
sum <= M → 가능 → lt = mid + 1, answer 갱신
sum > M → 불가능 → rt = mid - 1
모든 요청액의 합이 M보다 작으면
→ 상한액 없이 전부 지급 가능
→ 최대 요청액이 정답
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine().trim());
int[] moneys = new int[n];
StringTokenizer st = new StringTokenizer(br.readLine());
int sum = 0;
for (int i = 0; i < n; i++) {
moneys[i] = Integer.parseInt(st.nextToken());
sum += moneys[i];
}
int m = Integer.parseInt(br.readLine().trim());
Arrays.sort(moneys);
if (sum <= m) {
System.out.println(moneys[n-1]);
return;
}
int lt = 1, rt = moneys[n-1], answer = 0;
while (lt <= rt) {
int mid = (lt + rt) / 2;
sum = 0;
for (int x : moneys) sum += Math.min(x, mid);
if (sum > m) rt = mid - 1;
else { lt = mid + 1; answer = Math.max(answer, mid); }
}
System.out.println(answer);
}
}