https://www.acmicpc.net/problem/1450
๐ ์๋ฐ(Java)๋ก ํธ๋ ๋ถ๋ถ ์์ด์ ํฉ ๋ฌธ์ - ๋ฐฑ์ค 1450 ๐
๐ ๋ฌธ์ ๊ฐ์
๋ฐฑ์ค 1450๋ฒ - ๋ ์ ๋ฌธ์ ๋
์ต๋ N = 30๊ฐ์ ๋ฌผ๊ฑด์ด ์ฃผ์ด์ง ๋,
๊ฐ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๋ฅผ ๋ํด ์ดํฉ์ด C ์ดํ์ธ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ ๋๋ค.
- 1 ≤ N ≤ 30, 1 ≤ C ≤ 1e9
- ๋ฌด์์ ๋ชจ๋ ์กฐํฉ์ ๋๋ฆฌ๋ฉด 2³โฐ ≈ 10์ต ๊ฐ, ์๊ฐ ์ด๊ณผ ๋ฐ์โ
- โก ๊ทธ๋์ “Meet in the Middle(์ค๊ฐ์์ ๋ง๋๊ธฐ)” ์ ๋ต์ ์ฌ์ฉํฉ๋๋ค.
๐ ์๊ณ ๋ฆฌ์ฆ ์ ๊ทผ ๋ฐฉ์: Meet in the Middle
โ๏ธ ํต์ฌ ์ ๋ต
- ๋ฐฐ์ด์ ๋ฐ์ผ๋ก ๋๋๊ณ ๊ฐ๊ฐ ๊ฐ๋ฅํ ๋ถ๋ถํฉ์ ์กฐํฉ์ ๋ชจ๋ ๊ตฌํจ
- ํ ์ชฝ ๋ฐฐ์ด์ ์กฐํฉ์ ๊ธฐ์ค์ผ๋ก, ๋๋จธ์ง์์ ๋ํด๋ C ์ดํ๊ฐ ๋๋ ์กฐํฉ ๊ฐ์๋ฅผ ์ด์ง ํ์์ผ๋ก ์ธ๊ธฐ
๊ฒฐ๊ตญ O(2^(N/2) * log(2^(N/2)) ≈ 2^15 * 15 ≈ ์์ญ๋ง ์ฐ์ฐ์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅ
๐น Java ์ฝ๋ ์ค๋ช
sumCombination(0, N/2, left, 0);
sumCombination(N/2, N, right, 0);
โ ์ ๋ ฅ ๋ฐฐ์ด์ ๋ฐ์ผ๋ก ๋๋์ด, ๊ฐ๊ฐ ๋ชจ๋ ์กฐํฉ์ ํฉ์ ๋ฆฌ์คํธ์ ์ ์ฅ
โ ์: [1,2,3] → ๊ฐ๋ฅํ ๋ถ๋ถํฉ: 0, 1, 2, 3, 1+2, 2+3, ...
private static void sumCombination(int start, int end, ArrayList<Long> list, long sum) {
if(end == start){
if(sum <= C) list.add(sum);
return;
}
sumCombination(start + 1, end, list, sum);
sumCombination(start + 1, end, list, sum + weights[start]);
}
โ ๋ถ๋ถ ์กฐํฉ์ DFS ๋ฐฉ์์ผ๋ก ํ์
โ ๊ฐ ๋ถํ ๋ ๊ตฌ๊ฐ์ ๋ํด ๊ฐ๋ฅํ ๋ชจ๋ ๋ถ๋ถํฉ์ ๊ธฐ๋ก
Collections.sort(right);
โ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ๋ ์ด์ง ํ์์ ์ํด ์ ๋ ฌ
for (long sumL : left) {
if (sumL > C) continue;
long remain = C - sumL;
int idx = upperBound(right, remain);
count += idx;
}
โ ์ผ์ชฝ ์กฐํฉ์ ๊ธฐ์ค์ผ๋ก,
โ ์ค๋ฅธ์ชฝ์์ sumL + sumR ≤ C๋ฅผ ๋ง์กฑํ๋ sumR ๊ฐ์๋ฅผ upperBound()๋ก ๊ตฌํจ
๐ upperBound ํจ์
private static int upperBound(ArrayList<Long> list, long remain) {
int leftIdx = 0, rightIdx = list.size();
while(leftIdx < rightIdx){
int mid = (leftIdx + rightIdx) / 2;
if(list.get(mid) <= remain){
leftIdx = mid + 1;
} else rightIdx = mid;
}
return leftIdx;
}
โ list[i] ≤ remain์ ๋ง์กฑํ๋ ์ต๋ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋ upper bound
โ leftIdx๊ฐ ๊ณง ๊ฐ๋ฅํ ์์ ๊ฐ์๊ฐ ๋จ
๐ ์ ๋ฆฌ
โ ํต์ฌ ํฌ์ธํธ
- N์ด ์์ง๋ง, ๋ถ๋ถ์งํฉ์ด ๋๋ฌด ๋ง์ ๋๋ → Meet in the Middle ์ ๋ต
- ์ ์ฒด ์กฐํฉ์ ๋๋ ์ ๊ฐ๊ฐ ๋ถ๋ถํฉ์ ์ ์ฅํ๊ณ , ์ด์ง ํ์์ผ๋ก ์นด์ดํธ
- upperBound๋ฅผ ํ์ฉํ ๋น ๋ฅธ ๋ฒ์ ๋ด ์กฐํฉ ๊ฐ์ ๊ณ์ฐ
'Algorithm & Data Structures > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
b14002. ๊ฐ์ฅ ๊ธด ์ฆ๊ฐํ๋ ๋ถ๋ถ์์ด 4 (0) | 2025.04.15 |
---|---|
b12852. 1๋ก ๋ง๋ค๊ธฐ 2 (0) | 2025.04.14 |
b3665. ์ต์ข ์์ (0) | 2025.04.09 |
b.2696 ์ค์๊ฐ ๊ตฌํ๊ธฐ (0) | 2025.04.07 |
b.2075 N๋ฒ์งธ ํฐ ์ (0) | 2025.04.04 |