1.orderOfPresentation

해피데빙·2022년 1월 19일
0

코딩테스트

목록 보기
1/52
post-thumbnail
post-custom-banner

문제

김코딩은 모든 조별 발표 순서에 대한 경우의 수를 차례대로 구한 뒤 발표 순서를 말하면 이 발표 순서가 몇 번째 경우의 수인지를 대답해야 합니다.

총 조의 수 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;
 
        
    
}
profile
노션 : https://garrulous-gander-3f2.notion.site/c488d337791c4c4cb6d93cb9fcc26f17
post-custom-banner

0개의 댓글