문제
N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
출력
첫째 줄에 합이 S가 되는 부분수열의 개수를 출력한다.
풀이
주어진 수열의 모든 부분수열을 검토하며 그 합이 S가 될 경우 카운트해줘야한다
먼저 재귀를 통해 주어진 수열의 i번째 값을 더하는 경우와 더하지 않는 경우를 고려한다
def part_sequence(sets_sum,sets_num, pointer):
if pointer >= N:
return
if sets_num != 0 and sets_sum == S:
global count
count += 1
part_sequence(sets_sum+nums[pointer],sets_num+1,pointer+1)
part_sequence(sets_sum,sets_num,pointer+1)
크기가 0인 부분수열을 걸러내기 위해 부분수열의 크기를 변수 sets_nums로 판단하였고 sets_sum에 더해준 값을 인자로 넘겨주며 S와 비교하여 검토하였다.
하지만 오답이 나왔고 이유를 곰곰히 생각해보니 위와같이 전달한 인자를 검토하는 순서로 구성하면 수열의 마지막 값이 고려되지 않는다.
그래서 현재 인덱스 값을 sets_sum에 먼저 더해준 뒤 검토하고 전달할 때 빼주는 방식으로 순서를 바꿨다
def part_sequence(sets_sum,pointer):
if pointer >= N:
return
sets_sum += nums[pointer]
if sets_sum == S:
global count
count += 1
part_sequence(sets_sum,pointer+1)
part_sequence(sets_sum-nums[pointer],pointer+1)
이렇게 되면 현재 pointer가 가리키고 있는 수열인덱스 값을 하나 이상 포함하여 검사하므로 크기가 0인 수열 필터링도 필요가 없어진다.
코드의 흐름을 파악과 순서 배치의 중요성을 다시 한번 느꼈다
'알고리듬' 카테고리의 다른 글
[프로그래머스] 모음사전 (0) | 2024.11.04 |
---|---|
[백준 2121] 넷이 놀기 (0) | 2024.06.15 |
[백준 15661] 링크와 스타트 (1) | 2023.10.23 |
[백준 14889] 스타트와 링크 (1) | 2023.10.20 |
[백준 14501] 퇴사 (0) | 2023.10.19 |