문제
김코딩은 모든 조별 발표 순서에 대한 경우의 수를 차례대로 구한 뒤 발표 순서를 말하면 이 발표 순서가 몇 번째 경우의 수인지를 대답해야 합니다.
총 조의 수 N과 선생님이 말씀하시는 발표 순서 k가 주어질 때, 김코딩이 정답을 말 할 수 있게 올바른 리턴 값을 구하세요.
모든 경우의 수가 담긴 배열은 번호가 작을수록 앞에 위치한다고 가정합니다.
ex) N = 3일경우, [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]
인자 1: N
Number 타입의 1 <= N <= 12인 조의 개수
인자 2: K
Number타입의 Array (0 <= index)
ex) n이 3이고 k가 [2, 3, 1]일 경우
모든 경우의 수를 2차원 배열에 담는다면 [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]이 되고,
반환하는 값은 3이 됩니다.
k내에 중복되는 요소는 없다고 가정합니다.
입출력 예시
let output = orderOfPresentation(3, [2, 3, 1]);
console.log(output); // 3
output = orderOfPresentation(5, [1, 3, 2, 4, 5])
console.log(output); // 6
function orderOfPresentation(N, K){
//방법1: 전체 경우의 수를 구하고 그중 K의 위치 구하기: maximum callstack 넘는다
//방법2: K 이전에 올 수 있는 경우의 수들을 모두 더한다
//인덱스별로 이전에 올 수 있는 경우의 수들을 구해서 모두 더한다
-> (1) K[i]보다 작고 [작은 순서대로]
(2) i 이전 인덱스에 사용되지 않은 [중복 불가]
: 사용 시 false -> true로 바꾸는 배열 사용
원소들의 개수를 구한다
function factorial(n){
if(n===0){
return 1;
}
return n * factorial(n-1);
}
let order=0;
let checkArr = Array(N+1).fill(false);
//index와 숫자가 일치하기 위해
for(let i=0; i<N; i++){
let current = K[i]; //도는 중
checkArr[current] = false; //사용 여부
let smallArr = checkArr.slice(1, current);//(1)current보다 작은 수
let smallCnt = smallArr.filter(el => el ===false).length; //(1) && (2)사용하지 않은 수
order += smallCnt * factorial(N - 1 - i);
//i(앞에 있는 수의 개수), 1(본인)
}
return order;
}