Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- BFS
- 종만북
- JavaScript
- greedy
- DP
- 정수론
- BASIC
- 따배씨
- Math
- Algorithm
- udemy
- 생활코딩
- Cleancode
- dfs
- graph
- 백준
- 따라하며 배우는 C언어
- 인프런
- 따라하면서 배우는 C언어
- Algospot
- php
- BOJ
- server
- web
- Python
- C
- programmers
- sorting
- String
- C언어
Archives
- Today
- Total
몽상실현개발주의
[BOJ] 1208 / 부분수열의 합 2 / Python 파이썬 본문
https://www.acmicpc.net/problem/1208
풀이
1181 / 부분수열의 합 문제의 심화 문제이다.
부분수열의 합 문제의 경우에는 주어진 수열의 길이가 최대 20개 이므로 Combinations 과 DFS 로 모든 경우의 수를 구하여서 해결 하였다.
하지만 부분수열의 합 2 문제에서는 수열의 길이가 최대 40이기 때문에, 모든 경우가 2**40 개로 어마어마한 시간이 걸리게 된다.
이를 극복하기 위하여 수열을 절반으로 나누어 왼쪽과 오른쪽 수열을 각각 DFS 로 해결 하였다.
2**40 -> (2**20)* 2 = 2**21
N, S = map(int, input().split())
nums = list(map(int, input().split()))
res = 0
leftNums = {}
def DFS(idx, E, add, side):
global S, N, res
if idx == E:
if side == 'L':
if not add in leftNums:
leftNums[add] = 1
else:
leftNums[add] += 1
elif S-add in leftNums:
res += leftNums[S-add]
return
DFS(idx+1, E, add+nums[idx], side)
DFS(idx+1, E, add, side)
# 왼쪽 절반 수열
DFS(0, N//2, 0, 'L')
# 오른쪽 절반 수열
DFS(N//2, N, 0, 'R')
if S == 0:
res -= 1
print(res)
'Algorithm PS > BOJ' 카테고리의 다른 글
[BOJ] 2632 / 피자판매 / Python 파이썬 (0) | 2021.08.22 |
---|---|
[BOJ] 7453 / 합이 0인 네 정수 / Python 파이썬 (0) | 2021.08.22 |
[BOJ] 1261 / 알고스팟 / Python 파이썬 (0) | 2021.08.12 |
[BOJ] 1806 / 부분 합 / Python 파이썬 (0) | 2021.08.12 |
[BOJ] 1644 / 소수의 연속합 / Python 파이썬 (0) | 2021.08.12 |
Comments