순열과 조합 template

해피데빙·2022년 3월 3일
0

코딩테스트

목록 보기
6/52
post-thumbnail
post-custom-banner

내가 헷갈렸던 것들
.slice(first, end) !== .splice(first, num)
: slice는 first부터 end-1까지 복사
: splice는 first부터 num만큼 자르기

push,pop,shift : mutable, 반환하는 값은 각각 길이 또는 사라지는 값

반복문을 이용해 순열과 조합 만들기

중복 순열
3개 중 3개 뽑아서 중복 순열 만들기
: 모든 요소들을 for문으로 돌린다

function forloop(){
let result=[];
let lookup=[1,2,3];

for(let i=0; i<3; i++){ 
	for(let j=0; j<3; j++){ 
    	for(let k=0; k<3; k++){ 
        	result.push(lookup[i], lookup[j], lookup[k])
        }
    }
}

중복 순열
3개 중 2개 뽑아서 중복 순열 만들기
: lookup 중에 2개 뽑아서 나열한다

function forloop(){
let result=[];
let lookup=[1,2,3];

for(let i=0; i<3; i++){ 
let pick1 = lookup[i]; 
	for(let j=0; j<3; j++) { 
    let pick2 = lookup[j]
    	result.push([pick1, pick2]); 
    }
}
return result;

}

순열
3개 중 3개를 뽑아서 순열을 만들기
: 인덱스끼리 같은게 있으면 안되니까 같으면 push를 하지 않는다

function forloop(){
let result=[];
let lookup= [1,2,3];

for(let i=0; i<3; i++){ 
	for(let j=0; j<3; j++){ 
    	for(let k=0; k<3; k++){ 
        	if(i===j || j===k || k=== i)continue; 
            // ||는 첫번째 요소가 true면 두번째 요소부터 보지 않는다
            result.push(lookup[i], lookup[j], lookup[k]);
        }
    }   
}

return result;

}

조합
3개 중 2개를 뽑아서 조합을 만들기
: 순서가 상관이 없으니까 i를 이용해서 result에 넣으면 또 넣을 필요 없다

function forloop(){
let result=[];
let lookup=[1,2,3];

for(let i=0; i<3; i++){ 
	for(let j=i+1; j<3; j++){ 
    		result.push(lookup[i], lookup[j]);
    }
}

}

중복 순열
3개 중 3개 뽑아서 중복 순열 만들기
let result=[];
const lookup=[1,2,3];

function recursion(count, bucket){

if(count ===0){
result.push(bucket);
return;
}

for(let i=0; i<3; i++){

const pick=lookup[i]; 
//pick = 1

recursion(count-1, bucket.concat(pick));
//concat으로 쓰는 이유 : push는 전체 배열의 길이 반환

i=0일 때
//recursion(2, [1]) 
//recursion(1, [1,1])
//recursion(0, [1,1,1]) -> result = [[1,1,1]]

i=1일 때 
pick=2
recursion(2, bucket.concat(2))[2]
//i=0 : recursion(1, bucket.concat(1)) [2, 1]
//-> recursion으로 들어와서 :i=0 recursiont(0, bucket.concat(1)) [2,1,1]
// -> count===0이므로 result에 bucket push 

}

}

recursion(3, []);

Pick Or Not
const elements = ["가", "나", "다", "라"];

const pickOrNot = (idx, basket) => {

if(idx === element.length){
console.log(basket)
return;
}

pickOrNot(idx+1, basket.concat(elements[idx]));
pickOrNot(idx+1, basket);

};

pickOrNot(0, []);

조합 template

 const Combinations = (arr, selectNumber) => { 
 	if(selectNumber ===1) return arr.map((v) => [v])
    //1개만 뽑는거면 모두 [] 씌우면 된다
    
    const result=[]; 
    arr.forEach((v, idx) => { 
    const rest = arr.slice(idx+1); 
    //하나의 value를 선택하면 그것을 다시 선택할 수 없다 
    //idx=2일 때는 idx=1, 2 둘다 제외한다 
    //3부터 rest로 넣어서 selectNumber가 1일 될 때까지 작아지고 
    그다음에 거꾸로 올라오면서(rest+1, selectNumber+1) 각 요소당 v추가
    const restCombination = Combiations(rest, selectNumber-1); 
    //한 개 적게 선택했을 때
    const attached = restCombinations.map((combination) => [v, ...combination]
    //앞에 v만 넣는다 (v는 arr의 요소들) 
    }
 }

profile
노션 : https://garrulous-gander-3f2.notion.site/c488d337791c4c4cb6d93cb9fcc26f17
post-custom-banner

0개의 댓글