본문 바로가기
Algorithm/백준

[Python] 백준 1182번 - 부분수열의 합

by 애기 개발자 2023. 7. 14.
반응형

https://www.acmicpc.net/problem/1182

 

1182번: 부분수열의 합

첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.

www.acmicpc.net

 

혼자 힘으로 풀었는가? △

알고리즘 분류
 - 브루트포스 알고리즘
 - 백트래킹

 

문제

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

 

글 읽기 - 고수님들 차이점 명확히 알고싶습니다.

댓글을 작성하려면 로그인해야 합니다.

www.acmicpc.net

 

위의 게시글을 참조하였다.

 

 

 

반응형

댓글