버미

백준 1182번 - 부분수열의 합(C++) 본문

코딩 트레이닝

백준 1182번 - 부분수열의 합(C++)

Bum_2 2023. 8. 5. 23:13

문제

N개의 정수로 이루어진 수열이 있을 때, 크기가 양수인 부분수열 중에서 그 수열의 원소를 다 더한 값이 S가 되는 경우의 수를 구하는 프로그램을 작성하시오.

입력

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

출력

첫째 줄에 합이 S가 되는 부분수열의 개수를 출력한다.

예제 입력 1 

5 0
-7 -3 -2 5 8

예제 출력 1 

1

문제 풀이

#include <iostream>
using namespace std;
int N, S;
int arr[30];
int result = 0;

void find(int cnt, int sum) 
{ 
	if (cnt == N) { 
		if (sum == S) result++; 
		return; 
	}
	find(cnt + 1, sum); 		//13번째 라인
	find(cnt + 1, sum + arr[cnt]);  //14번째 라인
}
int main(void) 
{
    ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> N >> S;
	for (int i = 0; i < N; i++) 
		cin >> arr[i];
	find(0, 0);
	if (S == 0) result--; // s가 공집합일 경우 -1
	cout << result;
    
    return 0;
}

아이디어

N개의 원소를 받아 합이 S가 되게 만들어야 하는 문제였다.

몇 개를 더하든지는 상관이 없어서 모든 배열을 순회하면서 부분 합을 더해 맞는 조건일 때, result에 값을 더해줬다.

13번 ~ 14번 라인에서는 배열을 마치 노드의 중위 순회처럼 배열의 값을 순회하며 더하는 방식으로 구현했다.