728x90
300x250
https://www.acmicpc.net/problem/2512
<순서>
1. 요청 정렬
2. 범위 탐색
3. X 더해서 예산 편성
4. 합 비교하여 범위 조정
<Java 코드>
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
//System.setIn(new FileInputStream("Test.txt"));
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int arr[] = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken());
//정렬
Arrays.sort(arr);
//상한액 X 선언
int x = Integer.MIN_VALUE;
//조사범위 선언
int start = 1;
int end = arr[N-1];
//이분탐색
while(start <= end) {
int mid = (start+end)/2;
//mid값으로 각각 예산 요청 가능한지 체크
int sum = 0;
for (int i = 0; i < arr.length; i++) {
sum += Math.min(arr[i], mid);
}
if(sum == M) {
x = mid;
break;
} else if (sum > M ) {
//예산을 넘어가게되면 상한액을 낮춰야함
end = mid -1;
} else {
//예산이 남으면 상한액을 올려보자
start = mid+1;
x = Math.max(x, mid);
}
}
System.out.println(x);
}
}
728x90
'알고리즘 > 이분 탐색' 카테고리의 다른 글
백준 7795번: 먹을 것인가 먹힐 것인가 [이분탐색][정렬] - Java (0) | 2023.10.18 |
---|---|
백준 1654번: 랜선 자르기 [이분탐색][매개변수탐색]-Java (0) | 2023.09.01 |
백준 2805번: 나무 자르기 [이분탐색][매개변수탐색][BinarySearch] -Java (0) | 2023.08.30 |
백준 2470번: 두 용액 [이분 탐색][투 포인터][정렬] -Java (0) | 2023.08.28 |
백준 10816번: 숫자 카드2 [이분 탐색][자료구조] - Java (0) | 2023.08.19 |