본문 바로가기

BOJ/Node.js

[BOJ / Node.js] 1182. 부분수열의 합

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);