오늘부터 코드스테이츠에서 공부하고 있는 Toy 문제를 하나씩 정리해볼 예정이다.
벌써부터 아득한 기분이 들지마, 해볼 때까지 해보려고 한다.
조의 개수와 조의 발표 순서를 인자로 받는 함수 구현이다.
모든 경우의 발표 순서 중에 인자로 받은 발표 순서가 몇 번째인지 확인해야한다.
조 번호가 작을 수록 앞에 위치하며, 발표 순서는 하나의 배열에 담는다.
let output = orderOfPresentation(3, [2, 3, 1]);
console.log(output); // 3
1) 두 번째 인자로 들어가는 배열의 요소의 인덱스 및 크기에 주목하자.
2) 배열의 첫 요소가 '2'조 이면,
1조로 시작하는 경우, 그러니까 1조 다음에 2조와 3조가 오는 경우의 수(2!) 이후의 발표 순서일 것이다.
3) 배열의 첫 요소가 '3'조 이면,
앞에서 2조로 시작했으니 빼고, 자신의 수보다 작은 수의 경우의 수(1!) 이후의 발표 순서일 것이다.
function orderOfPresentation (N, K) {
const factorial = function (num) {
if (num <= 1) return 1;
return num * factorial(num - 1)
}
// factorial 함수 하나를 만든다
let order = 0;
const isUsed = Array(N+1).fill(false)
// 조의 수보다 하나 많은 false 배열을 만든다.
// 이미 앞에서 어떤 조의 경우의 수가 활용되었는지 파악하기위한 용도이다.
for (let i=0; i < K.length; i++) {
isUsed[k[i]] = true;
// * k배열의 i번째 값을 변경하여 자기 자신의 수를 제외할 수 있다.
// 만약 조가 3개라면 0번째 조 제외하고 동시에 0번째 조보다 작은 조로 시작하는 경우의 수를 찾는다.
const unusedRest = isUsed.slice(1, K[i]);
// 따로 만든 isUsed 배열에서 k배열 i번째 조의 위치까지 잘라서,
const validCnt = unusedRest.filter((el) => el === 'false').length;
// false의 개수를 세면 자기 자신 보다 적은 수를 알 수 있다.
const formerCnt = validCnt* factorial (k - i -1);
// 그 수 곱하기 k배열 인덱스 위치를 통해 알 수 있는 factorial 값을 곱해준다.
// k배열 각 인덱스 값을 조회하면 다양한 조별 순서 구성 중 몇 번째 순서 구성인지 알 수 있다.
order = order + formerCnt
}
return order;
}