코딩테스트 문제 1

Jelkov Ahn·2021년 11월 9일
0

코딩테스트

목록 보기
1/8
post-thumbnail

문제
N명의 학생의 발표순서가 될 수 있는 경우의 수가 차례대로 정렬되어 있다면, 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이 됩니다.

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) {
  let arr = [];
  let order = 0;

  for(let i=0; i<N; i++){ //N은 총 조의 수 = K의 길이 
    arr.push(K[i])  // (3, [2, 3, 1]) 이렇게 인자가 주어졌으면, arr = [2,3,1]
    for (let j=1; j<= K[i]-1; j++){
      //배열안에 인자가 1부터 시작하니깐 j=1부터, ex) i=0일때는 j=1까지  / i=1 일때는, j=2까지./ i=2일때는 j는 실행되지 않는다. 
      let sum = 1;
      if(!arr.includes(j)) { // i=0,j=1일때 if문을 확인한다. i=0일때, arr=[2]// i=1일때, arr=[2,3]// i=2일때 arr=[2,3,1] 인 상태이다. j값이 포함되어 있지 않으므로 if문이 실행된다. 
        for(let n=1; n <= N - i -1; n++){ //i=0 일때는 n=2까지// i=1일때 n=1 까지는 // i=2일때 n은 실행되지 않는다.
          sum = n *sum
        }
        order = sum + order
      }
    }
  }
  return order;
    // TODO: 여기에 코드를 작성합니다.
}
// N은 이중배열안에 길이가 N이다. 
// K는 이중배열 인덱스 중 하나이다.
// N개일때 나오는 경우의 수는 3! 이다 3 *2 *1 

다른 코드들

function orderOfPresentation(N, K) {
  let arr = [];
  let result = 0;

  function factorial(n) {
    if (n <= 1) {return 1}
    return n * factorial(n - 1);
  }

  for (let i = 0; i < N; i++) {
    arr.push(K[i]);
    const repeatNum = K.filter((v) => K[i] > v && !arr.includes(v)).length;
    result += repeatNum * factorial(N - i - 1);
  }

  return result;
}

profile
끝까지 ... 가면 된다.

0개의 댓글