728x90
오답 노트 & 새로 알게 된 점
해당 문제는 매개 변수 탐색 방법을 사용하면 된다.
정해진 총액 이하에서 가능한 최대의 총 예산을 구해라
-> 예산이 n일 때, 정해진 총액을 만족하느냐를 구하면 된다.
여기서 이분 탐색을 실시할 때, e값을 생각해보아야한다.
만약에 e를 M의 최댓값인 10억이라고 잡는다면, 예제 입력2와 같이
총 나라의 예산을 합쳐도 총합 예산보다 작다면 상한액을 10억이라할 수 있기 때문이다.
즉, 모든 요청이 배정될 수 있는 경우에는 요청한 금액을 그대로 배정하면 된다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
package Week10;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int atoi(String str) {
return Integer.parseInt(str);
}
static int N; //지방 수
static int M; //총 예산
static int A[];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = atoi(br.readLine());
A = new int[N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
A[i] = atoi(st.nextToken());
}
M = atoi(br.readLine());
paraSearch();
}
//target은 상한액을 의미한다.
static boolean possible(int target) {
int sum = 0;
for (int i = 0; i < N; i++) {
if(A[i] > target) sum += target;
else sum += A[i];
}
return sum <= M;
}
static void paraSearch() {
int s = 0, e = 0, rel = 0;
for (int i = 0; i < N; i++) e = Math.max(e, A[i]);
//최댓값은 금액들의 최댓값이어야한다.
while (s <= e) {
int mid = (s + e) / 2;
if (possible(mid)) {
rel = mid;
s = mid + 1;
}
else e = mid - 1;
}
System.out.println(rel);
}
}
/**
* 정해진 총액 이하에서 가능한 한 최대의 총 예산을 구해라
* -> 예산이 n일 때, 정해진 총액을 만족하느냐?
*
*/
|
cs |
728x90
'BOJ(Java)' 카테고리의 다른 글
자바(백준) 1072 게임 (0) | 2021.01.19 |
---|---|
자바(백준) 1654 랜선 자르기 (0) | 2021.01.15 |
자바(백준) 2805 나무 자르기 (0) | 2021.01.14 |
자바(백준) 2776 암기왕 (0) | 2021.01.13 |
자바(백준) 10816 숫자 카드2 (0) | 2021.01.13 |