https://leetcode.com/problems/subsets/description/
코드설명
비트마스킹(BitMask) 을 활용합니다.
물론, 이 문제에서 재귀를 활용해도 됩니다만, BitMask의 경우 부분집합 구현에 유명한 방식이기에 BitMask 방식을 사용합니다.
모든 칸을 1111 의 집합이 존재할경우 가능한 부분집합의 개수는 2^4 입니다. 즉, 결국 BitMask에서 -1 씩 뺴면서 0으로 만드는 경우를 모두 진행하면, 모든 경우가 나온다는 의미입니다.
결국 1111의 값을 0으로 만들면서 15, 14, 13, 12, 11, ... 0 까지 움직이며, 각 숫자마다 비트마스킹으로 1의 위치에 따른 값을 ret list에 넣어주면, 해당 집합의 모든 부분집합을 구할 수 있습니다.
코드
class Solution { public List<List<Integer>> subsets(int[] nums) { int N = nums.length; int bitmask = (1 << N) - 1;//111 List<List<Integer>> answer = new ArrayList<>(); answer.add(new ArrayList<>()); for(int subset = bitmask; subset > 0; subset = ((subset - 1) & bitmask)){ ArrayList<Integer> ret = new ArrayList<Integer>(); int newsubset = subset; //처음에 subset을 바로 사용했음. 그럴경우 timeout. int k = 0; while(newsubset > 0){ if( (newsubset & 1) > 0){ ret.add(nums[N - 1 - k]); } k++; newsubset >>= 1; } Collections.reverse(ret); answer.add(ret); } return answer; } }
'알고리즘 > LeetCode' 카테고리의 다른 글
| [LeetCode] 71. Simplify Path - 구현(Implementation) + 문자열(String) JAVA (0) | 2024.12.11 |
|---|---|
| [LeetCode] 72. Edit Distance - 깊이우선탐색(DFS) JAVA (0) | 2024.12.04 |
| [LeetCode] 73. Set Matrix Zeroes - 구현(Implementation) JAVA (0) | 2024.12.04 |
| [LeetCode] 48. Rotate Image - 구현(Implementation) JAVA (0) | 2024.12.01 |
| [LeetCode] 54. Spiral Matrix - 구현(Implementation) JAVA (0) | 2024.12.01 |