728x90
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
문제
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
Solve
- 모든 부분 수열의 합을 탐색하기 위해 재귀적인 방법을 선택했습니다.
- 파라미터로 더한 횟수인 count와 최대로 더할 수 있는 횟수인 limit를 전달하면서 더한 횟수가 최대일 경우 합계가 s와 같은지 검사 후 return 합니다.
Code
const input = require("fs").readFileSync("/dev/stdin").toString().trim().split("\n");
const [n, s] = input[0].split(' ').map(el=>+el);
const arr = input[1].split(' ').map(el=>+el);
let answer = 0;
const solution = (index, sum, count, limit) => {
if(count === limit) {
if(sum === s) {
answer++;
}
return;
}
for(let i = index ; i < n; i++) {
solution(i+1, sum + arr[i], count+1, limit);
}
}
for(let i = 0 ; i < n; i++) {
solution(0, 0, 0, i+1);
}
console.log(answer);
'BOJ > Node.js' 카테고리의 다른 글
[BOJ / Node.js] 23881. 알고리즘 수업 - 선택 정렬 1 (0) | 2023.03.11 |
---|---|
[BOJ / Node.js] 1057. 토너먼트 (0) | 2023.03.10 |
[BOJ / Node.js] 1487. 물건 팔기 (0) | 2023.03.08 |
[BOJ / Node.js] 23968. 알고리즘 수업 - 버블 정렬 1 (0) | 2023.03.06 |
[BOJ / Node.js] 1302. 베스트셀러 (0) | 2023.03.05 |