1. ๋ฌธ์ ์ค๋ช ๐
2. ์ ๊ทผ ๋ฐฉ์ ๐๏ธ
KEY WORD
: Binary Search
, Parametric Search
- (1)
๋ชจ๋ ์ง๋ฐฉ ์์ฐ์ ํฉ
<=์ด ์์ฐ
, ๊ทธ๋๋ก ์์ฐ ์ฑ ์ ํ๊ณ , ์ ์ผ ์ปธ๋ ์ง๋ฐฉ ์์ฐ์ ์ถ๋ ฅ - (2)
๋ชจ๋ ์ง๋ฐฉ ์์ฐ์ ํฉ
>์ด ์์ฐ
: ์์ฐ ์ต์๊ฐ๊ณผ ์ต๋๊ฐ ์ฌ์ด์์ ์ด๋ถ ํ์์ ํตํด, ๋ชจ๋ ์์ฐ์ ์ฒ๋ฆฌํ๋ฉด์ ์ต๋์ธ ๊ฐ์ ์ฐพ์์ ์ถ๋ ฅ
(1) Parametric Search ์ฐ์ธ ๊ณณ
๋ชจ๋ ์์ฐ์ ์ฒ๋ฆฌํ ์ ์๋ ์ต๋๊ฐ ๊ตฌํ๊ธฐ
โf(d) = ์์ฐ ์ํ์ก์ด d์ผ ๋, ์ด๊ฑธ๋ก ์ด ์์ฐ M ๋ด์์ ์ ๋ถ ์ฒ๋ฆฌ ๊ฐ๋ฅํ๊ฐ?
์ฌ๋ฌ ๊ฐ
์์ ๊ฐ์ด ์ต์ ํ ๋ฌธ์ ๋ฅผ ๊ฒฐ์ ๋ฌธ์ ์ฌ๋ฌ๊ฐ๋ก ๋ฐ๊พธ์ด ํผ๋ค.
f(d) = true๊ฐ ๋์ค๋ ๊ฐ ์ค ์ต๋ํ ์ค๋ฅธ์ชฝ์ ์๋ ๊ฐ์ ๊ตฌํ๋ฉด ๋ต์ด๋ค. (์ฆ f(d) = true๊ฐ ๋๋ d์ ์ต๋๊ฐ์ ๊ตฌํ๋ค.)
3. ์ฝ๋ ์๊ฐ ๐
import java.io.*;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Main {
static int N;
static int M;
static int [] budget;
public static void main(String[] args) throws IOException {
int sum = 0;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
budget = new int [N];
StringTokenizer st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
budget[i] = Integer.parseInt(st.nextToken());
sum += budget[i];
}
Arrays.sort(budget);
M = Integer.parseInt(br.readLine());
if(sum < M) {
System.out.println(budget[budget.length-1]);
return;
}
System.out.println(binary_search());
}
public static int binary_search() {
int start = 1;
int end = budget[budget.length-1];
while (start <= end){
int mid = start + (end - start)/2;
if(f(mid)) start = mid + 1;
else end = mid -1;
}
return start - 1;
}
public static boolean f(int mid){
int sum = 0;
for (int j : budget) {
sum += Math.min(j, mid);
}
return sum <= M;
}
}
4. ๋ฐฐ์ด ๊ฒ๋ค ๐ฏ
(1) ๋ด๊ฐ T/C๋ฅผ ์ฐพ์๋ณผ ์ ๋ฐ์ ์๊ฒ ๋ง๋ ๊ฒ๋ค
a. true, false ๊ตฌ๊ฐ ์ฐ์
์ฒ์์ f(d)
ํจ์์ return ๊ฐ์ sum < M ์ผ๋ก ํ๋ค. mid๊ฐ ์ํ์ก์ผ ๋ ์ดํฉ์ด ์ด ์์ฐ๊ณผ ๊ฐ์๋ true๊ฐ ๋์์ผ ํ๋๋ฐ, ๊ทธ๊ฒ์ ์ฐ์ ํ์ง ์์๋ค.
ํด๋น ๋ฐ๋ก
3
1 3 5
8
b. ์ด๋ถํ์ ์ต๋๊ฐ, ์ต์๊ฐ ๊ตฌ๊ฐ ์ฐ์
์ฒ์์๋ int start = budget[0]
๋ก ๋์ด, ์ง๋ฐฉ ์์ฐ ์ค ์ต์๊ฐ์ผ๋ก ์ ํ๋ค. ์ด๋ฌ๋ฉด ์ํ์ก์ด ์ง๋ฐฉ ์์ฐ์ ์ต์๊ฐ ๋ณด๋ค๋ ์์์ ธ์ผ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๊ณ์ฐํ์ง ๋ชปํ๋ค.
ํด๋น ๋ฐ๋ก
5
100 100 100 100 100
10