728x90
문제 출처:https://www.acmicpc.net/problem/1182
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
1.코드
#include <iostream>
using namespace std;
int n, s;
int arr[20];
int cnt = 0;
// index : 선택한 숫자의 인덱스, sum: 합
void find(int index, int sum) {
sum += arr[index];
if (index >= n) return;
if (sum == s) cnt++;
//재귀호출 따로 따로
find(index + 1, sum - arr[index]); // 해당 숫자를 안 더함
find(index + 1, sum); // 해당 숫자를 더함
}
int main(void) {
scanf("%d %d", &n, &s);
for (int i = 0; i < n; i++) {
scanf("%d",&arr[i]);
}
find(0, 0);
printf("%d\n", cnt);
}
2. 해결과정
부분수열의 합이 s가 되는 경우의 수를 찾는 문제이다. 재귀함수를 이용해서 인덱스 값 1~n까지 차례대로 현재 인덱스의 수를 더하는 경우와 현재 인덱스의 수를 패스하는 경우에 대해서 각각 계싼을 해줬고, sum=s가 되면 카운트를 해주면 되는 문제였다.
3. 느낀점
연속된 수의 합을 찾는 것이 아니고, 부분집합의 합을 구하는 것이 아니라 중복이 포함된다는 점이 구현하기에 까다로웠던 부분이였다. 또한 재귀에 대해서 아직 잘 못해서 호출을 따로따로 해줘야 하는 것도 어려웠다. dfs에 대해서 다시한번 정리하는 시간을 가져야할듯하다.
728x90
'공부 자료 > 알고리즘' 카테고리의 다른 글
(C/C++) 백준 2447번 - 별 찍기 -10 (0) | 2021.07.19 |
---|---|
(C/C++) 백준 17478번 - 재귀함수가 뭔가요? (0) | 2021.07.19 |
[알고리즘] 깊이 우선 탐색(DFS) (0) | 2021.07.15 |
(C/C++) 백준 10974번 - 모든 순열 (0) | 2021.07.14 |
(C/C++) 백준 1051 번 - 숫자 정사각형 (0) | 2021.07.14 |