関連概念とコードクリーンアップの組合せ、ソート

21810 ワード

コンポジット

  • コンセプト
    ・組合せは、異なるnにおいてr個を選択した場合の数を表す.(順序なし)
  • 冗長選択x
    - nCr
  • 計算
  • コード1
    次は、3つの異なる要素を抽出するコードです.
  • function solution(arr) {
        let tmp=[];
        for(let i=0; i<arr.length-2; i++){
            for(let j=i+1; j<arr.length-1; j++){
                for(let k=j+1; k<arr.length; k++){
                    tmp.push([arr[i], arr[j], arr[k]]);
                }
            }
        }
        return tmp;
    }   
    let arr=['a', 'b', 'c', 'd', 'e'];
    console.log(solution(arr));
    
  • 結果
  • [
      [ 'a', 'b', 'c' ],
      [ 'a', 'b', 'd' ],
      [ 'a', 'b', 'e' ],
      [ 'a', 'c', 'd' ],
      [ 'a', 'c', 'e' ],
      [ 'a', 'd', 'e' ],
      [ 'b', 'c', 'd' ],
      [ 'b', 'c', 'e' ],
      [ 'b', 'd', 'e' ],
      [ 'c', 'd', 'e' ]
    ]
  • コード2)dfs(開始点をdfsに渡し、重複を避ける)
    https://velog.io/@rladpwl0512/8-14-%EC%A1%B0%ED%95%A9-%EA%B5%AC%ED%95%98%EA%B8%B0
  • function solution(n, r) {
        let answer=[];
        let tmp=Array.from({length:r}, ()=>0);
        
        function DFS(v, s){
            if(v===r){
                answer.push(tmp.slice());
            }
            else{
                for(let i=s; i<=n; i++){
                    tmp[v]=i;
                    DFS(v+1, i+1);
                }
            }
        }
        DFS(0, 1);
        return answer;
    }   
    console.log(solution(4, 2)); //4C2(1~4 중 2개 뽑음)
  • コード3)の組み合わせの番号(注記バージョン)
    https://velog.io/@rladpwl0512/8-12-%EC%A1%B0%ED%95%A9%EC%9D%98-%EA%B2%BD%EC%9A%B0%EC%88%98%EB%A9%94%EB%AA%A8%EC%9D%B4%EC%A0%9C%EC%9D%B4%EC%85%98
  • くりかえしくみたて

  • コンセプト
    繰返し組合せとは、n個の繰返し可能な数からr個を選択することを意味する.(順序なし)
  • 計算
  • 整列


  • コンセプト
  • シーケンスは、異なるnにおいてr個が選択される数を意味する.(順次)
  • 繰り返し選択x
  • nPr
  • 順番は引いてから順番を考えますが、組み合わせは吸ってもいいです。

  • 計算#ケイサン#


  • コード#コード#
    https://velog.io/@rladpwl0512/8-10-%EC%88%9C%EC%97%B4-%EA%B5%AC%ED%95%98%EA%B8%B0
    抽出数を格納するtmp配列と重複できないため,抽出したch配列の有無を調べる必要がある.
  • function solution(m, arr){         
      let answer=[];
      n=arr.length;
      let ch=Array.from({length:n}, ()=>0); //사용했는지 체크하는 배열(중복 방지!)
      let tmp=Array.from({length:m}, ()=>0); //뽑은것 넣는 배열
      function DFS(L){
        if(L===m){
          answer.push(tmp.slice()); //깊은복사
        }
        else{
          for(let i=0; i<n; i++){
            //ch[i]가 0일때(중복되지 않을 때) 사용 가능 
            if(ch[i]===0){
              ch[i]=1; //사용하면 1으로 바꿈
              tmp[L]=arr[i];
              DFS(L+1);
              ch[i]=0; //백해서 다시 돌아오는 지점에서는 0으로 초기화시켜줌 
            }
          }
        }
      }
      DFS(0);
      return answer;
    }
    
    let arr=[3, 6, 9];
    console.log(solution(2, arr));

    繰り返し順

  • コンセプト
    反復シーケンスとは、n個の反復可能シーケンスからr個を選択した場合の数である.(順次)
  • 計算
    https://velog.io/@rladpwl0512/8-8-%EC%A4%91%EB%B3%B5%EC%88%9C%EC%97%B4-%EA%B5%AC%ED%95%98%EA%B8%B0
  • コード(nでm個抽出する場合、長さmのtmpを作成)🍯)
  • function solution(n, m){
      let answer=[];
      let tmp=Array.from({length:m}, ()=>0); //길이가 m인 배열 0으로 초기화해서 생성
      function DFS(L){
        if(L===m){
          answer.push(tmp.slice()); //slice는 깊은복사(깊은복사 안하면 마지막갚으로 모두 push됨)
        }
        else{
          for(let i=1; i<=n; i++){
            tmp[L]=i; //넣고 (대입하는 것! 따로 빽할때 처리해줄 필요 없다)
            DFS(L+1); //다음 레벨로 넘어감 
          }
        }
      }
    
      DFS(0);
      return answer;
    }
    console.log(solution(3, 2));

    参考資料

  • https://blog.naver.com/PostView.nhn?blogId=algosn&logNo=221413837039
  • https://widekey6.tistory.com/105