๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1450
โธ ๋ฌธ์
์ธ์ค์ด๋ N๊ฐ์ ๋ฌผ๊ฑด์ ๊ฐ์ง๊ณ ์๊ณ , ์ต๋ C๋งํผ์ ๋ฌด๊ฒ๋ฅผ ๋ฃ์ ์ ์๋ ๊ฐ๋ฐฉ์ ํ๋ ๊ฐ์ง๊ณ ์๋ค.
N๊ฐ์ ๋ฌผ๊ฑด์ ๊ฐ๋ฐฉ์ ๋ฃ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ N๊ณผ C๊ฐ ์ฃผ์ด์ง๋ค. N์ 30๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์, C๋ 10^9๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ด ์๋ ์ ์์ด๋ค. ๋์งธ ์ค์ ๋ฌผ๊ฑด์ ๋ฌด๊ฒ๊ฐ ์ฃผ์ด์ง๋ค. ๋ฌด๊ฒ๋ 10^9๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
โธ ์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฐ๋ฐฉ์ ๋ฃ๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 1
- ๐ ๋ฌธ์ ์ ํ : ์ด๋ถ ํ์, ์ค๊ฐ์์ ๋ง๋๊ธฐ
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
์ด ๋ฌธ์ ๋ ๋ฌผ๊ฑด์ ์๊ฐ ์ต๋ 30๊ฐ์ด๊ณ , ๊ฐ ๋ฌผ๊ฑด์ ๊ฐ๋ฐฉ์ ๋ฃ๊ฑฐ๋ ๋ฃ์ง ์๋ ๋ ๊ฐ์ง ์ ํ์ง๊ฐ ์๋ค.
๋ฐ๋ผ์ ๋ชจ๋ ๊ฒฝ์ฐ๋ฅผ ์์ ํ์์ผ๋ก ๊ณ์ฐํ๋ฉด ์ต๋ 2^30 ≈ 10์ต ๊ฐ์ง ๊ฒฝ์ฐ๋ฅผ ํ์ธํด์ผ ํ๋ค.
์ด๋ 1์ด์ 1์ต ๋ฒ ์ฐ์ฐ์ด ๊ฐ๋ฅํ๋ค๊ณ ํด๋ 10์ด ์ด์ ๊ฑธ๋ฆฌ๋ฏ๋ก, ๋ ํจ์จ์ ์ธ ์ ๊ทผ์ด ํ์ํ๋ค.
์ด๋ ์ฌ์ฉํ ์ ์๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ ์ค๊ฐ์์ ๋ง๋๊ธฐ(Meet in the Middle) ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ค๊ฐ์์ ๋ง๋๊ธฐ ์๊ณ ๋ฆฌ์ฆ์ด๋ ? ๐ค
ํ๋์ ๊ทธ๋ฃน ์ ์ฒด๋ฅผ ์์ ํ์ํ๊ธฐ ์ด๋ ค์ธ ๋, ๋ ๊ทธ๋ฃน์ผ๋ก ๋๋์ด ๊ฐ๊ฐ์ ๊ฒฝ์ฐ๋ฅผ ๊ณ์ฐํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์กฐํฉํ์ฌ ๋ต์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ด๋ค.
ํ์ ๋์์ ์ ๋ฐ์ผ๋ก ๋๋๋ฉด ์ฐ์ฐ๋์ด ํฌ๊ฒ ์ค์ด๋ ๋ค.
๐ฏ ๊ทธ๋ ๋ค๋ฉด ๋ฌธ์ ์ ์ค๊ฐ์์ ๋ง๋๊ธฐ ์๊ณ ๋ฆฌ์ฆ์ ์ ์ฉํด๋ณด์.
๋จผ์ , ์ฃผ์ด์ง ๋ฌผ๊ฑด์ ์ ๋ฐ์ผ๋ก ๋๋์ด
- ๊ทธ๋ฃน A : 0 ~ N/2 - 1
- ๊ทธ๋ฃน B : N/2 ~ N - 1
๊ฐ ๊ทธ๋ฃน์์ ๋ง๋ค ์ ์๋ ๋ชจ๋ ๋ถ๋ถํฉ์ ๊ตฌํ๋ค.
๊ทธ ํ, ๊ทธ๋ฃน A์ ๋ถ๋ถํฉ ํ๋๋ฅผ ๊ณ ์ ํ๊ณ , ๊ทธ๋ฃน B์์ C - ๋ถ๋ถํฉ(A) ์ดํ๊ฐ ๋๋ ๊ฐ์ ๊ฐ์๋ฅผ ์ฐพ์ ๋ํ๋ค.
๐ก ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์ ๊ตฌํ๊ธฐ
weight1๊ณผ weight2๊ฐ ๊ฐ๊ฐ์ ๊ทธ๋ฃน(๋ฐฐ๋ญ)์ด๋ผ๊ณ ์๊ฐํ๋ฉด, ๋ค์๊ณผ ๊ฐ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๊ฐ ๊ณ์ฐ๋๋ค.
- ๋ ๊ทธ๋ฃน์ ๋ฌผ๊ฑด์ ๋ชจ๋ ๋ด๋ ๊ฒฝ์ฐ
- ๊ทธ๋ฃน A์ ๋ฌผ๊ฑด๋ง ๋ด๋ ๊ฒฝ์ฐ
- ๊ทธ๋ฃน B์ ๋ฌผ๊ฑด๋ง ๋ด๋ ๊ฒฝ์ฐ
- ๋ ๋ค ๋ด์ง ์๋ ๊ฒฝ์ฐ
๐ง ์ ๋ ฌ๊ณผ ์ด๋ถ ํ์
๊ทธ๋ฃน B์ ๋ถ๋ถํฉ ๋ฐฐ์ด(sum2)์ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๋ค.
์ ๋ ฌ์ ํ๋ฉด ํน์ ๊ฐ ์ดํ์ ์์ ๊ฐ์๋ฅผ ์ด๋ถ ํ์์ผ๋ก ๋น ๋ฅด๊ฒ ์ฐพ์ ์ ์๋ค.
- sum1[i]๋ฅผ ๊ธฐ์ค์ผ๋ก target = C - sum1[i] ๊ณ์ฐ
- sum2์์ target ์ดํ์ธ ์์ ๊ฐ์ = upperBound(sum2, target)
์ด ๊ณผ์ ์ ๋ชจ๋ sum1[i]์ ๋ํด ๋ฐ๋ณตํ๊ณ , ๊ทธ ๊ฐ์๋ฅผ ๋ชจ๋ ํฉ์ฐํ๋ฉด ์ ์ฒด ๊ฒฝ์ฐ์ ์๊ฐ ๋๋ค.
์ ํ์ด์ ์ฝ๋๋ฅผ ๋ฐํ์ผ๋ก ์ ์ฒด์ ์ธ ์ฝ๋๋ฅผ ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 17288KB
์๊ฐ : 168ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.StringTokenizer;
public class Main {
static int n, c;
static int[] arr;
static ArrayList<Integer> left, right;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken()); // ๋ฌผ๊ฑด์ ๊ฐ์
c = Integer.parseInt(st.nextToken()); // ๊ฐ๋ฐฉ์ ๋ฃ์ ์ ์๋ ๋ฌด๊ฒ
arr = new int[n];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < n; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
left = new ArrayList<>();
right = new ArrayList<>();
comb(left, 0, n/2, 0);
comb(right, n/2, n, 0);
Collections.sort(right);
int ans = 0;
for (int i = 0; i < left.size(); i++) {
int searchValue = c - left.get(i);
// ์ธ๋ฑ์ค๋ฅผ ๋ฐํํ๋ฏ๋ก +1
ans += binarySearch(right, searchValue)+1;
}
System.out.println(ans);
br.close();
}
private static int binarySearch(ArrayList<Integer> sum, int target) {
int left = 0;
int right = sum.size();
while (left < right) {
int mid = (left+right)/2;
if (sum.get(mid) <= target) {
left = mid+1;
} else {
right = mid;
}
}
return left-1;
}
private static void comb(ArrayList<Integer> list, int start, int end, int sum) {
if (sum > c) return; // ํ์ถ ์กฐ๊ฑด
if (start == end) {
list.add(sum);
return;
}
// ๋ฌผ๊ฑด์ ๋ฃ๋ ๊ฒฝ์ฐ
comb(list, start+1, end, sum+arr[start]);
// ๋ฌผ๊ฑด์ ๋ฃ์ง ์๋ ๊ฒฝ์ฐ
comb(list, start+1, end, sum);
}
}
์ด๋ถ ํ์์ ๊ณต๋ถํ๋ ์ค์ ์ค๊ฐ์์ ๋ง๋๊ธฐ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ ๋ฌธ์ ๋ ์ฒ์ ์ ํด์, ๊ฐ๋ ์ ๊ณต๋ถํ ๋ค์ ํ์ด๋ณด์๋ค.
์ฝ๋ ๊ตฌ์กฐ๋ ์ง๊ธ๊น์ง ์์ฑํด์๋ ๊น์ด ์ฐ์ ํ์๊ณผ ์ด๋ถ ํ์ ์ฝ๋์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์, ํฐ ์ด๋ ค์ ์์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
์ต๊ทผ ๋ค์ด ๋น์ทํ ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ง ํ์๋๋ฐ ์ค๋๋ง์ ์๋ก์ด ์๊ณ ๋ฆฌ์ฆ ๋ฌธ์ ๋ผ ์์ฃผ ์ฌ๋ฐ๊ฒ ํ์๋ค ! ๐๐
'Algorithm > BOJ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Boj_10972] ๋ค์ ์์ด (0) | 2025.08.20 |
---|---|
[Boj_1208] ๋ถ๋ถ์์ด์ ํฉ 2 (3) | 2025.08.10 |
[Boj_1561] ๋์ด ๊ณต์ (4) | 2025.08.05 |
[Boj_1194] ์์ด์คํฌ๋ฆผ ๋๋ ์งํธ (3) | 2025.08.05 |
[Boj_1194] ๋ฌ์ด ์ฐจ์ค๋ฅธ๋ค, ๊ฐ์. (0) | 2025.07.25 |