codestates/section4

조 발표 순서 계산 알고리즘

나아눙 2023. 3. 21. 17:32
function orderOfPresentation(N, K) {
    // 조의 개수 N, 발표 순서 K

  
    const factorial = (n) => {
      if (n <= 1) return 1;
      return n * factorial(n - 1);
    }; //팩토리얼 n!
  
    let order = 0;
    
    // N개의 조 중에, 어떠한 조가 이미 포함되었는지 확인하기 위해 배열을 생성
    // 제일 첫 번째는 더미 데이터
    const isUsed = Array(N + 1).fill(false);
    
    for (let i = 0; i < K.length; i++) {
      // K의 i번째 조를 변수에 담는다.
      const num = K[i];
      // 사용했으면 true
      isUsed[num] = true;
      //1부터 num-1의 배열을 복제해서,
      const candidates = isUsed.slice(1, num);
      // 사용하지 않는 수의 개수를 구한다.
      const validCnt = candidates.filter((el) => el === false).length;
      // 사용하지 않은 수의 경우의 수를 카운트한다.
      const formerCnt = validCnt * factorial(N - i - 1);
      // order에 추가
      order = order + formerCnt;
  
     
    }
    
    return order;

인덱스 0에는 아무 데이터나 넣어놓고, 실제 조의 번호를 사용할 때는 인덱스 1부터 사용하는 방법을 사용하고,

인덱스 0은 더미 데이터로 사용

 

ex ) 3, [2,3,1]

IsUsed [ false , false , false ,false]

candidate = [ false]로 validCnt는 1이 된다.

formerCnt = 1 * factorial(3 - 0 - 1)

order는 2 추가

 

IsUsed [false, false, true, false]

candidate = [false] validCnt는 1이 된다.

formerCnt  = 1 * factorial(3 - 1 - 1)

order는 1 추가

 

IsUsed [false, true, true, true]
candidate = [] validate는 0이다.
formerCnt는 0
 
order는 3
 

 

 

각 조가 선택될 때, 그 전에 이미 선택된 조들의 경우의 수는 (해당 조 앞에 올 수 있는 사용되지 않은 조의 수) * (앞으로 선택해야 하는 모든 조의 경우의 수)