이번엔 재귀를 사용해보려고 한다. 이번문제는 간단하다. N이라는 숫자를 넣었을때 N의 부분집합을 모두구하면 된다.
예를 들어 3을 투입했을때, 아래와 같은 집합이 부분집합들이다.
1 2 3
1 2
1 3
1
2 3
2
3
기본적으로 0,1을 어떤 배열에 넣고 최종적으로 1인것만 구별하여 경우의 수를 뽑아내는 방법을 써야한다. 로직을 보자.
ch[num] = 1
이라고 한다ch[num] = 0
이라고 바꾼다그럼 코드를 적어보자.
function subSet(n) {
let ch = Array.from({ length: n }, () => 0);
let tempArr;
let answer;
function dfs(num) {
if (num > n) {
for (let i = 0; i < ch.length; i++) {
if (ch[i] === 1) {
tempArr.push(i);
}
}
if (tempArr.length > 0) answer.push(tempArr);
tempArr = [];
} else {
ch[num] = 1;
dfs(num + 1);
ch[num] = 0;
dfs(num + 1);
}
}
dfs(1);
return answer;
}
그럼 ch에 따라서 tempArr가 바뀌는 것을 알 수 있다.
dfs트리를 그림으로 나타내면 아래와 같다.