Toy_ #1.orderOfPresentation

const_yang·2021년 10월 13일
1

Toy야 놀자

목록 보기
1/14
post-thumbnail

오늘부터 코드스테이츠에서 공부하고 있는 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;
}
  
  
  

0개의 댓글