ํฐ์คํ ๋ฆฌ ๋ทฐ
๋ฌธ์
๋ฌธ์ ํ์ด
์์ ๋ค๋ฃฌ ๋ถ๋ถ์์ด์ ํฉ ๋ฌธ์ ์์ N์ ๋ฒ์๊ฐ 40์ผ๋ก ์ฆ๊ฐํ ๋ฌธ์ ์ด๋ค. ๋ฐ๋ผ์ ๊ธฐ์กด์ ํ์ด๋ ์ด ๋ฌธ์ ์ ์ ์ฉํ ์ ์๋ค. ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๋ฌธ์ ๋ ํ ๋ฒ์ N์ ๋ํ ๋ถ๋ถ์์ด์ ๋ชจ๋ ๊ตฌํ๋ ๊ฒ์ด ์๋, ์์ด์ ์ข/์ฐ์ธก์ผ๋ก ๋๋์ด ๋ถ๋ถ์ ์ผ๋ก ๊ตฌํ ํ์ ์ข์ธก์ ์์ ๊ฐ + ์ฐ์ธก์ ํฐ ๊ฐ๋ถํฐ ์ ์ฐจ์ ์ผ๋ก ๊ณ์ฐํด S์ ๋ง์กฑํ๋์ง ์ฐพ๊ฒ ๋๋ฉด ์๊ฐ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
def dfs(idx, end_idx, subtotal, ret):
if idx == end_idx:
ret.append(subtotal)
return
dfs(idx + 1, end_idx, subtotal, ret)
dfs(idx + 1, end_idx, subtotal + nums[idx], ret)
return sorted(ret), len(ret)
if __name__ == "__main__":
answer = 0
n, s = map(int, stdin.readline().split())
nums = list(map(int, stdin.readline().split()))
left, len_l = dfs(0, n // 2, 0, [])
right, len_r = dfs(n // 2, n, 0, [])
# ์๋ ๋ถ๋ถ์ ์๋ต
๋ถ๋ถ์์ด์ ๊ตฌํ๊ธฐ ์ํด ์ฒ์์๋ ์์ ๊ฐ์ด DFS๋ก ์์ฑํ์ฌ ๋ถ๋ถ์์ด์ ํฉ์ ๊ณ์ฐํ์๋ค. ์ง๋ฌธ ๊ฒ์ํ์ ๋ณด๋ฉด N์ด 40์ธ ๊ฒฝ์ฐ์ ์์๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ์ ์ ์๋ค.
์์ ์์๋ฅผ ํด๋น ์ฝ๋๋ก ๋๋ ค๋ณด๋ฉด ์๋ฌด๋ฆฌ ๊ธฐ๋ค๋ ค๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ์ง ์๋๋ค....๐ ๊ณ ๋ฏผ์ ํ๊ณ ๋ค๋ฅธ ์ฌ๋์ ํ์ด๋ฅผ ์ฐธ๊ณ ํ ๊ฒฐ๊ณผ, ์ ๋ฐ์ ๋๋ ํ ์ข์ธก์ ๋ํ ๋ถ๋ถ ์์ด์ ํฉ์ ๊ตฌํ๋ค๋ฉด, ์ฐ์ธก์ ๋ํ ๋ถ๋ถ ์์ด์ ํฉ์ ๊ตฌํ๋ฉด์ ๋ต์ ๊ตฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ ํจ์จ์ ์ด๋ผ๋ ๊ฒ์ ์ ์ ์์๋ค.
๋ฌธ์ ๋ฅผ ํธ๋ ๋ฐฉ๋ฒ์ ์ ๋ฆฌํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ์ฃผ์ด์ง ์์ด(์๋ค)์ ์ ๋ฐ์ผ๋ก ๋๋์ด ์ข์ธก์ ๋ํ ๋ถ๋ถ์์ด์ ํฉ์ ๊ตฌํ๊ณ ์ด๋ฅผ ์นด์ดํธํ๋ค.
- ๋์ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ฉด, ์ ๋ ฌ์ ๋ํ ๋ถ๋ถ๋ ์ฒ๋ฆฌํ ํ์๊ฐ ์๋ค.
- (S - ์ฐ์ธก ๋ถ๋ถ์์ด์ ํฉ)์ด ํ์ฌ ๋์
๋๋ฆฌ์ ์นด์ดํธ๋ ๊ฒ ์์ผ๋ฉด ์ ๋ต์ผ๋ก ๋ฐ์ํ๋ค.
- ๋ง์ฝ, ๋์ ๋๋ฆฌ์ ์นด์ดํธ๋์ง ์์ ๊ฐ์ ์ป๊ณ ์ ํ๋ค๋ฉด 0์ด ๋ฐ์๋๋ค.
- ํด๋น ๋ฐฉ์์ ์ข์ธก, ์ฐ์ธก์ ๊ตฌํ ํ์ ๋ค์ while๋ฌธ์ ๋๋ฉฐ ์ข์ธก๊ณผ ์ฐ์ธก์ ํฉ์ด S๋ฅผ ๋ง์กฑํ๋์ง ์ฒดํฌํ๋ ๋ฐฉ์๋ณด๋ค ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ผ๋ฉฐ, ์ ๋ ฌ์ ๋ํ ์ค๋ฒํค๋๋ ์์ ๊ฒ์ผ๋ก ์๊ฐ๋๋ค.
์ฝ๋
from sys import stdin
from collections import defaultdict
def dfs(idx, end_idx, subtotal, direction):
global answer
if idx == end_idx:
if direction == "right":
answer += left[s - subtotal]
else:
left[subtotal] += 1
return
dfs(idx + 1, end_idx, subtotal, direction)
dfs(idx + 1, end_idx, subtotal + nums[idx], direction)
if __name__ == "__main__":
answer = 0
n, s = map(int, stdin.readline().split())
nums = list(map(int, stdin.readline().split()))
left = defaultdict(int)
dfs(0, n//2, 0, "left")
dfs(n//2, n, 0, "right")
print(answer if s != 0 else answer - 1)
`defaultdict`๋ฅผ ํ์ฉํ์ฌ ๋์ ๋๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด value์ ๊ธฐ๋ณธ ์๋ฃํ์ ์ง์ ํ ์ ์์ด, ๋ณ๋์ ์์ธ์ฒ๋ฆฌ๊ฐ ํ์ ์๋ค.
'๐จโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค: 7453 ํฉ์ด 0์ธ ๋ค ์ ์ (0) | 2020.08.17 |
---|---|
๋ฐฑ์ค: 2143 ๋ ๋ฐฐ์ด์ ํฉ (0) | 2020.08.17 |
๋ฐฑ์ค: 1182 ๋ถ๋ถ์์ด์ ํฉ (0) | 2020.08.15 |
๋ฐฑ์ค: 1644 ์์์ ์ฐ์ํฉ (0) | 2020.08.14 |
๋ฐฑ์ค: 1860 ๋ถ๋ถํฉ (0) | 2020.08.13 |