본문으로 바로가기

[LeetCode] 78. Subsets - 문제풀이

category 알고리즘/LeetCode 2022. 2. 13. 22:33

Description

Given an integer array nums of unique elements, return all possible subsets (the power set).

The solution set must not contain duplicate subsets. Return the solution in any order.

Example 1:

Input: nums = [1,2,3]
Output: [[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]

Example 2:

Input: nums = [0]
Output: [[],[0]]

Constraints:

  • 1 <= nums.length <= 10
  • -10 <= nums[i] <= 10
  • All the numbers of nums are unique.

Solution 1. 역추적(back tracking)

public List<List<Integer>> subsets(int[] nums) {
    List<List<Integer>> result = new ArrayList<List<Integer>>();
    for (int i = 1; i <= nums.length; i++) {
        backTracking(result,new ArrayList<>(),nums, i, 0);
    }

    return result;
}

private void backTracking(List<List<Integer>> result, List<Integer> comb, int[] nums,  int len, int start){
    if(len == comb.size()){ // len : comb 자리수 기준 cur: 현재 담은 개수
        result.add(new ArrayList<>(comb));
        return;
    }
    for (int i = start; i < nums.length; i++) {
        comb.add(nums[i]);
        backTracking(result,comb, nums, len, i+1);
        comb.remove(comb.size()-1);
    }
}

재귀호출을 통해 마지막요소부터 역추적해서 요소를 채워나갑니다.

가능한 모든 경우의 수를 반환하는 문제이기 때문에 1개부터 nums의 length만큼 나올 수 있는 경우의수를 모두 반환 합니다.

Reference