반응형
https://www.acmicpc.net/problem/1182
혼자 힘으로 풀었는가? △
알고리즘 분류
- 브루트포스 알고리즘
- 백트래킹
문제
N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
출력
첫째 줄에 합이 S가 되는 부분수열의 개수를 출력한다.
백트래킹으로 푸는 문제인데 다풀어놓고 마지막에 몰라서 백준의 질문게시판을 뒤져보았다.
import sys
from collections import deque
input = sys.stdin.readline
n, s = map(int, input().split())
data = list(map(int, input().split()))
stack = []
cnt = 0
def dfs(pos):
global cnt
if sum(stack) == s and stack:
cnt += 1
print(stack)
#return
for i in range(pos, n):
stack.append(data[i])
dfs(i+1)
stack.pop()
dfs(0)
print(cnt)
보통의 재귀는 return을 주기 마련
하지만 이번 문제는 return을 줄 경우 수열의 뒷부분까지 확인이 불가능하기 때문에
return 없이 계속해서 스택에 쌓아나가는 형식이었다.
https://www.acmicpc.net/board/view/107433
위의 게시글을 참조하였다.
반응형
'Algorithm > 백준' 카테고리의 다른 글
[Python] 백준 11055번 - 가장 큰 증가하는 부분 수열 (0) | 2023.07.21 |
---|---|
[Python] 백준 6603번 - 로또 (0) | 2023.07.17 |
[Python] 백준 10799번 - 쇠막대기 (0) | 2023.07.13 |
[Python] 백준 4963번 - 섬의 개수 (0) | 2023.07.12 |
[Python] 백준 14889번 - 스타트와 링크 (0) | 2023.07.11 |
댓글