10이하의 N개의 자연수가 주어지면 이 중 M개를 뽑아 일렬로 나열하는 방법을 모두 출력합
니다.
numbers : [3,6,9]
M : 2
result :
3 6
3 9
6 3
6 9
9 3
9 6

[n] 은 해당 숫자가 numbers에서 몇 번째 인덱스에 있는지 나타낸다.
temp 배열에 넣어 최종 answer에 전달하기로 했다.
answer 에 가장 먼저 추가되어야 할 [3, 6] 부터 살펴보면, temp=[3,6] 을 실행하고 싶다고 했을 때 temp 의 0번째, 1번째, ... M 번째 인덱스 까지의 값을 채워야 M 개를 선택했다고 할 수 있다. (이 풀이에서는 M === 2 로 가정)temp[0] === [3, 3] 이 되고 만다. 이 문제는 중복순열 문제가 아니므로 중복된 값이 temp에 들어가서는 안된다.
ch 배열을 만들었다.
temp[L] = numbers[i](1) 와 DFS(L+1)(2) 를 무작정 실행하는게 아니라, ch 배열의i번째 인덱스가 0 일 때 (방문한 적 없을 때)만 (1) 과 (2)를 실행하도록 했다.const solution = (numbers, M) => {
const answer = [];
const temp = [];
const ch = Array.from({ length: numbers.length }, () => 0);
const DFS = L => {
if (L === M) {
answer.push([...temp]);
} else {
for (let i = 0; i < numbers.length; i++) {
if (ch[i] === 0) {
ch[i] = 1;
temp[L] = numbers[i];
DFS(L + 1);
ch[i] = 0;
}
}
}
};
DFS(0);
return answer;
};