PS/백준
[백준_1182] 부분 수열의 합 ( dfs - 자바스크립트 )
KimBangg
2021. 6. 9. 20:48
문제
https://www.acmicpc.net/problem/1182
1182번: 부분수열의 합
첫째 줄에 정수의 개수를 나타내는 N과 정수 S가 주어진다. (1 ≤ N ≤ 20, |S| ≤ 1,000,000) 둘째 줄에 N개의 정수가 빈 칸을 사이에 두고 주어진다. 주어지는 정수의 절댓값은 100,000을 넘지 않는다.
www.acmicpc.net
How to Solve ?
"양수만 존재하는 부분 집합의 합" 과는 다르게 음수있을 때 투포인터를 사용하면 값이 목표로 하는 "target"과 일치 하지 않을 때
1) 앞에서 제거
2) 뒤에서 제거
를 모두 해야 하는 경우가 발생한다.
즉, 포인터 2개로는 문제를 해결 하지 못하는 경우가 발생 하게 되는데 이는 "DFS"를 통해 해결이 가능하다.
function dfs(idx, sum) {
if (idx >= n) {
return;
}
sum += nums[idx];
if (sum === target) {
count += 1;
}
// 더한 값을 없애고
dfs(idx + 1, sum - nums[idx]);
// 유지 하고
dfs(idx + 1, sum);
}
const [n, target] = [5, 0];
const nums = [-7, -3, -2, 5, 8];
let count = 0;
dfs(0, 0);
console.log(count);