-
문제
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);
'PS > 백준' 카테고리의 다른 글
[백준_14889] 스타트와 링크 ( 백트래킹 - 자바스크립트 ) (0) 2021.06.10 [백준_1911] 흙길 보수하기 ( Greedy - 자바스크립트 ) (0) 2021.06.10 [백준_2018] 수들의 합5 ( 투포인터 - 자바스크립트) (0) 2021.06.09 [백준_2805] 나무 자르기 ( 이분탐색 - 자바스크립트 ) (0) 2021.06.09 [백준_11659] 구간 합 구하기 4 ( 자바스크립트 ) (0) 2021.06.09 댓글