https://www.acmicpc.net/problem/15655
문제설명
N개의 자연수와 자연수 M이 주어졌을 때, 아래 조건을 만족하는 길이가 M인 수열을 모두 구하는 프로그램을 작성하시오. N개의 자연수는 모두 다른 수이다.
- N개의 자연수 중에서 M개를 고른 수열
- 고른 수열은 오름차순이어야 한다.
풀이방법
result.push(numArr)
이렇게 해주면 numArr의 주소값이 result에 들어가서 findPermutation이 종료되고 난 후엔 result에 들어간 모든 수열이 같은 값을 출력한다!!!!!numArr[cur] = arr[i];
이 부분이 수열에 값을 넣는부분인데, 배열의 cur번째값으로 arr의 i번째 값을 넣는다. 이부분을 잘 이해해야한다!!!! 재귀함수가 호출되는 순서를 적어봤는데, for문내의 i와 잘 연결해서 추론해보면 이해가 될것이다..!function permutation(n, m, arr) {
const result = [];
const isSelected = Array.from(n).fill(false);
arr.sort((a, b) => a - b);
function findPermutation(cur, numArr) {
if (cur === m) {
result.push([...numArr]);
return;
}
for (let i = 0; i < n; i++) {
if (isSelected[i]) {
continue;
}
isSelected[i] = true;
numArr[cur] = arr[i];
findPermutation(cur + 1, numArr);
isSelected[i] = false;
}
}
findPermutation(0, []);
console.log(result);
}
permutation(4, 2, [4, 5, 2, 9]);