알아두면 좋은 '조합','순열' 코드

lovely·2022년 11월 25일
0
post-thumbnail
post-custom-banner

조합이란?
주어진 배열에서 무작위로 뽑아내 겹치지않는 인자들의 또다른 배열이다.
이렇게 얘기하면 사실 나도 헷갈린다.

const array = [1,2,3,4,5]

라고 할때 겹치지 않는 3가지를 무작위로 뽑아서 재배열을 한다면?

[1,2,3],[1,2,4],[1,2,5]...[3,4,5]

이런식으로 나열할 수 있다.

수학적으로는 5C3 (C=combination) (nCr)
5개중에 3개를 뽑는다는 뜻.

코드로 알면 좋을것 같아 무작위로 구글링했더니
대충 나오는 결과는 비슷해서

일단 외운 다음 한 줄 한 줄 이해하기로 했다.

const array = [1,2,3,4,5,6,7]
function getCombi(arr,selectNum){
	const result = [];
    if(selectNum === 1) return arr.map((el)=>[el]));
    
    arr.forEach((fixed,index,origin)=>{
    	//fixed = 첫번째로 뽑아 고정
        //index = 배열의 순서
        //origin = 내가 입력한 배열
>     	const rest = origin.slice(index+1);
//fixed를 제외한 나머지, index = 0부터 시작한다.
        const combi = getCombi(rest,selectedNum-1); //재귀함수, 인자와 selectNum-1 다시 자신에게 보낸다.
        const attached = combi.map((el)=>[fixed ...el]); // fixed와 뽑힌 인자들을 섞어준다.
        result.push(...attached); //스프레드로 나열
    }
    return result;
}

순열은 여기서 rest만 바꿔주면된다.

참고로 순열이란?
주어진 배열의 인자들을 뽑아 순서대로 재나열한 배열이다.

[1,2,3],[1,2,4],...[2,1,3],[2,1,4],...,[3,4,5],...[5,3,4]

이런식으로 숫자의 순서에 맞춰 내가 선택한 수 만큼의 배열을 만들어 주는것이다.
(결과값이 정말 많아서 테스트할때 조심해야한다..)

수학적으로는 3P2 (P = permutation) (nPr)
3개중에 2개를 뽑아 나열한다는 뜻.

const array = [1,2,3,4,5,6,7]
function getCombi(arr,selectNum){
	const result = [];
    if(selectNum === 1) return arr.map((el)=>[el]));
    
    arr.forEach((fixed,index,origin)=>{
>     	const rest = [...origin.slice(0, index), ...origin.slice(index+1)]; //첫 인자 + 나머지 인자
        const combi = getCombi(rest,selectedNum-1);
        const attached = combi.map((el)=>[fixed ...el]);
        result.push(...attached);
    }
    return result;

Tip1 조합과 순열의 나머지 인자 선택 차이

//조합
const rest = origin.slice(index+1);

//순열
const rest = [...origin.slice(0, index),
...origin.slice(index+1)];

Tip2 알아두면 좋은 메쏘드

Array.prototype.slice(a,b)
slice : 가위로 자르고 난 나머지, a(포함)부터 b(미포함)까지
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/slice

Array.prototype.splice(a,b,c)
splice : 가위로 잘라서 풀로 붙인 것, a번째 자리부터 b번째 자리까지 지우고, c를 넣어서 붙이기
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

String.prototype.split()
split : 분열, 문자열 자를때 쓰임
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/String/split

Array.from()
from : ~로부터, 인자를 배열로 바꿀때 쓰임
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/from

조만간 조합,순열을 활용한 예제를 들고오겠다😘

profile
the best FE (will be..)
post-custom-banner

0개의 댓글