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;
};