N명의 학생의 발표순서가 될 수 있는 경우의 수가 차례대로 정렬되어 있다면, K의 발표 순서가 몇 번째 경우의 수인지를 답하라
let output = orderOfPresentation(3, [2, 3, 1]);
console.log(output); // 3
function orderOfPresentation(N, K) {
let arr = [];
let result = 0;
for (let i = 0; i < N; i++) {
arr.push(K[i]);
for (let j = 1; j <= K[i] - 1; j++) {
if (!arr.includes(j)) {
let sum = 1;
for (let k = 1; k <= N - i - 1; k++) {
sum *= k;
}
result += sum;
}
}
}
return result;
}
오늘의 TIL은 재귀함수였다.
위의 코드는 for가 3번이나 중첩된다. 위의 작성된 코드는 간결하지도 않고, 이해하기도 힘들다.
오늘 배운 재귀함수를 활용하면 보다 간결한 코드를 작성할 수 있겠다는 생각이 든다.
그래서, 다음과 같이 리펙토링을 해 보았다.
function orderOfPresentation(N, K) {
let arr = [];
let result = 0;
function factorial(n) {
if (n <= 1) {return 1}
return n * factorial(n - 1);
}
for (let i = 0; i < N; i++) {
arr.push(K[i]);
const repeatNum = K.filter((v) => K[i] > v && !arr.includes(v)).length;
result += repeatNum * factorial(N - i - 1);
}
return result;
}