[SWEA][D3][#02817] 부분 수열의 합
작성:    
업데이트:
카테고리: SWEA D3
태그: ProblemSolving, SWEA D3, SWEA PS
출처
학습용 포스트입니다. 본 포스트가 문제가 될 시 수정 또는 삭제하겠습니다.
문제
A1, A2, … , AN의 N개의 자연수가 주어졌을 때, 최소 1개 이상의 수를 선택하여 그 합이 K가 되는 경우의 수를 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 테스트 케이스의 수 T가 주어진다.
각 테스트 케이스의 첫 번째 줄에는 2개의 자연수 N(1 ≤ N ≤ 20)과 K(1 ≤ K ≤ 1000)가 주어진다.
두 번째 줄에는 N개의 자연수 수열 A가 주어진다. 수열의 원소인 N개의 자연수는 공백을 사이에 두고 주어지며, 1 이상 100 이하임이 보장된다.
출력
각 테스트 케이스마다 ‘#x ’(x는 테스트케이스 번호를 의미하며 1부터 시작한다)를 출력하고, 부분 수열의 합이 K가 되는 경우의 수를 출력한다.
예제
입력
1
4 3
1 2 1 2
출력
#1 4
My Sol
def tree(i, ssum):
if ssum >= K:
if ssum == K:
global cnt
cnt += 1
return
if i == N:
return
tree(i+1, ssum)
tree(i+1, ssum+arr[i])
T = int(input())
for tc in range(1, T+1):
N, K = map(int, input().split())
arr = list(map(int, input().split()))
cnt = 0
tree(0, 0)
print(f'#{tc} {cnt}')
tree의 부분집합을 이용하여 가지치기를 하면서 수열의 합을 구하는 문제였다. 배열이 정렬되지 않고, 값이 같은 경우에 중복을 허용하기 때문에 처음에는 어떻게 풀어야하나 했지만, 트리를 이용하면 쉽게 접근할 수 있었다.
결과
PASS
댓글남기기