순열, 조합, 재귀
- 문제
- 1번부터 N번까지의 조(1<=N<=12)
- 주어진 조를 임의로 나열한 배열 K(중복되는 요소는 없음)
- 배열 K가 조를 나열하는 경우의 수 중, 몇번째인지를 구하는 문제
- 시도
- N개의 조를 가지고 만들수 있는 경우의 수는, 팩토리얼 N의 값
- 경우의 수를 전부 만들고, 그 중 몇번째인지를 탐색하는 방법은 사실상 불가(call stack over)
- 1개씩 고정시키고, 나머지 값의 팩토리얼을 통해서 해결하는 방법을 생각해봄
- 시간 내에 구상하지 못하고, 관련 내용만 찾아보다 종료함
- 이후 구글링을 통해 찾은 내용을 골자로 정리함
- 수도코드
function orderOfPresentation (N, K) {
function 팩토리얼{}
let 임의의 배열 = [1, .... N]
let result = 0;
while (K가 요소를 가지고 있다면) {
let 기준점 = k[0]의 값을 K배열에서 빼오고, 이 값이 임의의 배열에서 몇번 인덱스인가를 찾음
임의의 배열.splice(기준점, 1)
결과값 = 결과값 + 팩토리얼(K.length) * 기준점
}
리턴 결과값
}
- 완성 코드
function orderOfPresentation (N, K) {
function factorial(n) {
if (n <= 1) {
return n;
} return n * factorial(n - 1);
}
let mockArr = [];
for (let i = 1; i <= N; i++) {
mockArr.push(i);
}
let result = 0;
while (K.length > 0) {
let set = mockArr.indexOf(K.shift());
mockArr.splice(set, 1)
result = result + factorial(K.length)*set;
}
return result;
}