팩토리얼, slice, filter를 활용한 경우의 수 구하기 Javascript

cptkuk91·2022년 8월 17일
1

Algorithm

목록 보기
64/161

문제

말썽꾸러기 김코딩은 오늘도 장난을 치다가 조별 발표 순서가 담긴 통을 쏟고 말았습니다.
선생님께서는 미리 모든 발표 순서의 경우의 수를 저장해 놓았지만 김코딩의 버릇을 고치기 위해 문제를 내겠다고 말씀하셨습니다.
김코딩은 모든 조별 발표 순서에 대한 경우의 수를 차례대로 구한 뒤 발표 순서를 말하면 이 발표 순서가 몇 번째 경우의 수인지를 대답해야 합니다.
총 조의 수 N과 선생님이 말씀하시는 발표 순서 k가 주어질 때, 김코딩이 정답을 말 할 수 있게 올바른 리턴 값을 구하세요.
모든 경우의 수가 담긴 배열은 번호가 작을수록 앞에 위치한다고 가정합니다.
ex) N = 3일경우, [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]

주의 사항

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 solution (N, K) {
	let result = 0;
    
    const factorial = (n) => {
    	if(n <= 1){
        	return 1;
        }
        return n * factorial(n - 1);
    }
    
    let checkedNum = Array(N + 1).fill(false);
    
    for(let i = 0; i < K.length; i++){
    	let num = K[i];
        checkedNum[num] = true;
        let sliceNum = checkedNum.slice(1, num);
        let validNum = sliceNum.filter((el) => el === false).length;
        let countNum = validNum * factorial(N - i - 1);
        result += countNum;
    }
    return result;
}

문제에 대한 이해, 풀이부터가 어려운 문제다.

(수정 예정)

profile
메일은 매일 확인하고 있습니다. 궁금하신 부분이나 틀린 부분에 대한 지적사항이 있으시다면 언제든 편하게 연락 부탁드려요 :)

0개의 댓글