모든 경우의 수를 확인해야할 때
자연수 N과 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오.
1부터 N까지 자연수 중에서 중복 없이 M개를 고른 수열
ex)
input:
4 2
output:
1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 1
4 2
4 3
//백트래킹
/*
1. 아이디어
- 백트래킹 재귀함수 안에서, for 돌면서 숫자 선택(방문여부 확인)
- m의 조건이면 print
2. 시간복잡도
- 중복없으므로 N! = 최대 10까지
3. 자료구조
- 방문여부 = int[]
- 결과값 = int[]
- 입력값 = N,M
*/
const readline = require("readline");
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
const input = [];
rl.on("line", function (line) {
input.push(line);
}).on("close", () => {
const [N, M] = input[0].split(" ").map(Number);
const visit = [];
for (let i = 0; i < N + 1; ++i) {
visit.push(false);
}
const res = [];
function recur(num) {
//m과 일치할때
if (num == M) {
console.log(res.join(" "));
return;
}
for (let i = 1; i < N + 1; ++i) {
//방문하지 않았으면
if (visit[i] == false) {
visit[i] = true;
res.push(i);
recur(num + 1);
//되돌아가는 과정이 필요하다
visit[i] = false;
res.pop();
}
}
}
recur(0);
});