N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.
N개의 자연수 중에서 M개를 고른 수열
첫째 줄에 N과 M이 주어진다. (1 ≤ M ≤ N ≤ 8)
둘째 줄에 N개의 수가 주어진다. 입력으로 주어지는 수는 10,000보다 작거나 같은 자연수이다.
let input = require('fs').readFileSync('/dev/stdin').toString().trim().split('\n');
let [n,m] = [...input.shift().split(" ")];
let arr = input.shift().split(" ");
arr.map(e => +e).sort((a,b) => a-b);
const solution = (arr, m) => {
let answer = [];
arr.sort((a, b) => a - b);
let tmp = new Array(m).fill(0);
let visited = new Array(arr.length).fill(0);
const dfs = (L) => {
if (L === m) {
answer.push(tmp.join(" "));
} else {
for (let i = 0; i < arr.length; i++) {
if (!visited[i]) {
visited[i] = 1;
tmp[L] = arr[i];
dfs(L + 1);
visited[i] = 0;
}
}
}
};
dfs(0);
return answer.join("\n");
};
console.log(solution(arr,+m));
같은 수 허용하지 않는 순열
const sol = (arr, m) => {
const answer = [];
const visited = new Array(arr.length).fill(0);
let tmp = [];
const dfs = (L) => {
if (m === tmp.length) {
answer.push(tmp.join(" "));
} else {
for (let i = 0; i < arr.length; i++) {
if (!visited[i]) {
visited[i] = 1;
tmp.push(arr[i]);
dfs(L + 1);
tmp.pop();
visited[i] = 0;
}
}
}
};
dfs(0);
return answer;
};
console.log(sol([9, 8, 7, 1], 2).sort());