조합이란?
주어진 배열에서 무작위로 뽑아내 겹치지않는 인자들의 또다른 배열이다.
이렇게 얘기하면 사실 나도 헷갈린다.
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;
//조합
const rest = origin.slice(index+1);
//순열
const rest = [...origin.slice(0, index),
...origin.slice(index+1)];
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
조만간 조합,순열을 활용한 예제를 들고오겠다😘