정수 배열 nums와 정수 target이 주어져요. 원소의 합이 target이 되는 공집합이 아닌 부분집합의 개수를 반환해요.
값이 같아도 인덱스가 다르면 다른 부분집합이에요. 예를 들어 nums = [1, 1] 에서 합이 1인 부분집합은 두 개예요.
원소가 n개면 부분집합은 2ⁿ개예요. 0부터 2ⁿ - 1까지의 정수 하나하나를 어떤 원소를 골랐는지 나타내는 비트열로 보면, 반복문 하나로 모든 부분집합을 훑을 수 있어요. i번 비트가 켜져 있는지는 mask & (1 << i) 로 확인해요.
예시
예시 1
예시 2
예시 3
제한 사항
- 1 ≤ nums.length ≤ 15
- -1,000 ≤ nums[i] ≤ 1,000
- -15,000 ≤ target ≤ 15,000
for (let mask = 1; mask < (1 << n); mask++) 로 돌면 공집합인 0을 자연스럽게 건너뛰어요. 안쪽에서 i번 비트가 켜졌는지 확인하며 합을 만들어요. 1 << 15 는 32,768 이라 전부 훑어도 순식간이에요.javascriptCopy codefunction subsetSum(nums, target) {const n = nums.length;let count = 0;for (let mask = 1; mask < (1 << n); mask++) {let sum = 0;for (let i = 0; i < n; i++) {if (mask & (1 << i)) sum += nums[i];}if (sum === target) count++;}return count;}
예시 테스트만 실행 (Cmd/Ctrl+Enter)
숨김 테스트까지 채점 (Cmd/Ctrl+Shift+Enter)
에디터를 불러오고 있어요…
코드를 작성하고Ctrl↵를 눌러 예시 테스트를 확인해 보세요.