関連概念とコードクリーンアップの組合せ、ソート
21810 ワード
コンポジット
・組合せは、異なるnにおいてr個を選択した場合の数を表す.(順序なし)
- nCr
次は、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' ]
]
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개 뽑음)
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個を選択することを意味する.(順序なし)
整列
コンセプト
計算#ケイサン#
コード#コード#
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
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));
参考資料
Reference
この問題について(関連概念とコードクリーンアップの組合せ、ソート), 我々は、より多くの情報をここで見つけました https://velog.io/@rladpwl0512/조합-순열-관련-개념-및-코드-정리テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol