조별 발표 순서

lim1313·2021년 8월 24일
0

문제

N명의 학생의 발표순서가 될 수 있는 경우의 수가 차례대로 정렬되어 있다면, K의 발표 순서가 몇 번째 경우의 수인지를 답하라

입출력 예시

let output = orderOfPresentation(3, [2, 3, 1]);
console.log(output); // 3

1차 제출 답안

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

  for (let i = 0; i < N; i++) {
    arr.push(K[i]);

    for (let j = 1; j <= K[i] - 1; j++) {
      if (!arr.includes(j)) {
        let sum = 1;
    
        for (let k = 1; k <= N - i - 1; k++) {
          sum *= k;
        }
        result += sum;
      }
    }
  }
  return result;
}

오늘의 TIL은 재귀함수였다.

위의 코드는 for가 3번이나 중첩된다. 위의 작성된 코드는 간결하지도 않고, 이해하기도 힘들다.

오늘 배운 재귀함수를 활용하면 보다 간결한 코드를 작성할 수 있겠다는 생각이 든다.

그래서, 다음과 같이 리펙토링을 해 보았다.

리펙토링

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
start coding

0개의 댓글