๋ฌธ์
ํ์ด
1. ์ฃผ์ด์ง ์์ด์ ์ ๋ฐ์ผ๋ก ๋๋๋ค.
[-7, -3, -2, 5, 8] -> [-7, -3], [-2, 5, 8]
2. ๋๋ ์ง ์์ด์ ๋ถ๋ถ ์์ด์ ๊ตฌํ๋ค.
A : [-7, -3] -> [-7], [-3], [-7, -3]
B : [-2, 5, 8] -> [-2], [5], [8], [-2, 5], [-2, 8], [5, 8], [-2, 5, 8]
3. A์ ๋ถ๋ถ ์์ด ์ค ํ๋๋ฅผ ์ ํํ๊ณ , B์ ๋ถ๋ถ ์์ด ์ค ํ๋๋ฅผ ์ ํํ๋ฉด ๋ชจ๋ ๋ถ๋ถ ์์ด์ ๊ตฌํ ์ ์๋ค.
ex) [-7, -3, 5] = [-7, -3] + [5]
4. A, B ๋ถ๋ถ ์์ด์ ํฉ์ ๋ฐฐ์ด์ ์ ์ฅํ๋ค.
sumA : [-7, -3, -10]
sumB : [-2, 3, 5, 6, 8, 11, 13]
5. sumA, sumB ๊ทธ๋ฆฌ๊ณ sumA ์์ + sumB ์์๋ฅผ ํตํด ๋ชจ๋ ๋ถ๋ถ ์์ด์ ํฉ์ ๊ตฌํ ์ ์๋ค.
์ค์ํ ๋ถ๋ถ์ ๋ค ์ค๋ช ํ์ผ๋ ๋๋จธ์ง๋ ์๋ตํ๋ค.
์ฝ๋
import sys
from itertools import combinations
from bisect import bisect_left, bisect_right
input = sys.stdin.readline
def getNum(arr, find):
return bisect_right(arr, find) - bisect_left(arr, find)
def getSum(arr, sumArr):
for i in range(1, len(arr) + 1):
for a in combinations(arr, i):
sumArr.append(sum(a))
sumArr.sort()
n, s = map(int, input().split())
arr = list(map(int, input().split()))
left, right = arr[:n//2], arr[n//2:]
leftSum, rightSum = [], []
getSum(left, leftSum)
getSum(right, rightSum)
ans = 0
for l in leftSum:
find = s - l
ans += getNum(rightSum, find)
ans += getNum(leftSum, s)
ans += getNum(rightSum, s)
print(ans)
๋ง๋ฌด๋ฆฌ
ํ์ด์ 3๋ฒ์ ์๊ฐํ์ง ๋ชปํด ๊ตฌ๊ธ๋ง ํด์ ํ์๋ค ใ ใ