코딩테스트/SWEA
[Python, 파이썬] SWEA 2817. 부분 수열의 합
알코딩
2024. 10. 16. 00:22
A1, A2, ... , AN의 N개의 자연수가 주어졌을 때, 최소 1개 이상의 수를 선택하여
그 합이 K가 되는 경우의 수를 구하는 프로그램
def DFS(i, current_value):
global answer # 합이 K개가 되는 경우의 수
if(current_value > K): # 합이 K를 넘었을 시
return
if(current_value == K): # 합이 K일 시
answer += 1
return
if(i==N): # 수열 전체 검사 완료 시
return
DFS(i+1, current_value) # 현재 자연수 미선택
DFS(i+1, current_value+A[i]) # 현재 자연수 선택
T = int(input()) # 테스트케이스 수 T
for test_case in range(1, T+1):
N, K = map(int, input().split()) # 자연수의 개수 N, 합 K
A = list(map(int, input().split())) # 수열 A
answer = 0
DFS(0, 0) #
print("#%d %d" %(test_case, answer))
[문제풀이]
DFS+백트래킹으로 푸는 문제.
N개의 수 중 무작위로 골라서 합이 K가 되면 된다.
SWEA 5215번 햄버거 다이어트와 매-우 유사한 문제다.
고를 수 있는 개수도 정해져 있지 않고 합만 K개가 되면 되므로 모든 경우의 수를 확인해야 한다.
BFS(i+1, current_value) # 현재 자연수 미선택
BFS(i+1, current_value+A[i]) # 현재 자연수 선택
그래서 이렇게 현재 자연수 선택/미선택으로 백트래킹을 돌리면 끝!
이때 자연수를 찾을 시 경우의 수에 +1하고 DFS를 끝낸다.
또, K보다 크게 되거나 모든 자연수를 다 탐색했을 경우도 그대로 DFS를 끝낸다.