조합 순열 알고리즘 정리

중복조합
1. 배열에서 하나 선택후 인덱스를 1감소시킨후 다시호출
2. 인덱스가 1일경우 각 요소를 배열로 만들어 리턴
3. 리턴된 값을 1에서 선택한 값과 합침

중복조합

function perm(array, length) {
    return array.flatMap((v, i) => length > 1
        ? perm(array, length - 1).map(w => [v, ...w])
        : [[v]]
    );
}
perm(['a', 'b', 'c', 'd', 'e'], 3).forEach(a => console.log(...a));

조합
1. 배열에서 하나 선택후 선택한 요소를 제외한 배열과 인덱스를 1감소시킨후 다시호출
2. 인덱스가 1일경우 각 요소를 배열로 만들어 리턴
3. 리턴된 값을 1에서 선택한 값과 합침

조합 코드

function comb(array, length) {
    return array.flatMap((v, i) => length > 1
        ? comb(array.slice(i + 1), length - 1).map(w => [v, ...w])
        : [[v]]
    );
}
comb(['a', 'b', 'c', 'd', 'e'], 3).forEach(a => console.log(...a));

순열

const perm= function (arr, len) {
    const results = [];
    if (len === 1) return arr.map((value) => [value]); // 1개씩 택할 때, 바로 모든 배열의 원소 return
  
    arr.forEach((fixed, index, origin) => {
      const rest = [...origin.slice(0, index), ...origin.slice(index+1)] // 해당하는 fixed를 제외한 나머지 배열 
      const permutations = perm(rest, len - 1); // 나머지에 대해 순열을 구한다.
      const attached = permutations.map((permutation) => [fixed, ...permutation]); // 돌아온 순열에 대해 떼 놓은(fixed) 값 붙이기
      results.push(...attached); // 배열 spread syntax 로 모두다 push
    });
  
    return results; // 결과 담긴 results return
};

https://www.python2.net/questions-777952.htm
https://jun-choi-4928.medium.com/javascript%EB%A1%9C-%EC%88%9C%EC%97%B4%EA%B3%BC-%EC%A1%B0%ED%95%A9-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-21df4b536349

좋은 웹페이지 즐겨찾기