diff --git "a/zinnnn37/202601/31 BOJ G1 \353\266\200\353\266\204\354\210\230\354\227\264\354\235\230 \355\225\251 2.md" "b/zinnnn37/202601/31 BOJ G1 \353\266\200\353\266\204\354\210\230\354\227\264\354\235\230 \355\225\251 2.md" new file mode 100644 index 00000000..1c7fd75c --- /dev/null +++ "b/zinnnn37/202601/31 BOJ G1 \353\266\200\353\266\204\354\210\230\354\227\264\354\235\230 \355\225\251 2.md" @@ -0,0 +1,82 @@ +```java +import java.io.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.StringTokenizer; + +public class BJ_1208_부분수열의_합_2 { + + private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); + private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); + private static StringTokenizer st; + + private static int N, S; + private static int[] arr; + private static Map left, right; + + public static void main(String[] args) throws IOException { + init(); + sol(); + } + + private static void init() throws IOException { + st = new StringTokenizer(br.readLine()); + N = Integer.parseInt(st.nextToken()); + S = 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()); + } + Arrays.sort(arr); + + left = new HashMap<>(); + right = new HashMap<>(); + } + + private static void sol() throws IOException { + int mid = N / 2; + int bit = (1 << mid); + for (int mask = 0; mask < bit; mask++) { + int sum = 0; + for (int idx = 0; idx < mid; idx++) { + if ((mask & (1 << idx)) != 0) { + sum += arr[idx]; + } + } + left.put(sum, left.getOrDefault(sum, 0) + 1); + } + + int rightSize = N - mid; + bit = (1 << rightSize); + for (int mask = 0; mask < bit; mask++) { + int sum = 0; + for (int idx = 0; idx < rightSize; idx++) { + if ((mask & (1 << idx)) != 0) { + sum += arr[mid + idx]; + } + } + right.put(sum, right.getOrDefault(sum, 0) + 1); + } + + long ans = 0; + for (int key : left.keySet()) { + if (right.containsKey(S - key)) { + ans += (long) left.get(key) * (right.get(S - key)); + } + } + + if (S == 0) { + ans--; + } + + bw.write(ans + ""); + bw.flush(); + bw.close(); + br.close(); + } + +} +```