code 알고리즘/순열과 조합

순열, 조합, 중복순열

테오구 2021. 11. 10. 12:46
728x90

순열 코드

더보기

// [10000, 10, 1], 3

function permutation(arr, selectNum) {

let result = [];

if (selectNum === 1) return arr.map((v) => [v]);

arr.forEach((v, idx, arr) => {

const fixer = v;

// > Array [10, 1]

// > Array [1]

// > Array [10]

// > Array [10000, 1]

// > Array [1]

// > Array [10000]

// > Array [10000, 10]

// > Array [10]

// > Array [10000]

const restArr = arr.filter((_, index) => index !== idx);

// > Array [Array [1]]

// > Array [Array [10]]

// > Array [Array [10, 1], Array [1, 10]]

// > Array [Array [1]]

// > Array [Array [10000]]

// > Array [Array [10000, 1], Array [1, 10000]]

// > Array [Array [10]]

// > Array [Array [10000]]

// > Array [Array [10000, 10], Array [10, 10000]]

const permuationArr = permutation(restArr, selectNum - 1);

// > Array [Array [10, 1]]

// > Array [Array [1, 10]]

// > Array [Array [10000, 10, 1], Array [10000, 1, 10]]

// > Array [Array [10000, 1]]

// > Array [Array [1, 10000]]

// > Array [Array [10, 10000, 1], Array [10, 1, 10000]]

// > Array [Array [10000, 10]]

// > Array [Array [10, 10000]]

// > Array [Array [1, 10000, 10], Array [1, 10, 10000]]

const combineFixer = permuationArr.map((v) => [fixer, ...v]); result.push(...combineFixer);

});

return result;

}

중복순열 코드

더보기

function permutation(arr, selectNum) {

const result = [];

if (selectNum === 1) return arr.map((v) => [v]);

 

arr.forEach((v, idx, arr) => {

const fixed = v;

const restArr = arr;

 

const permutationArr = permutation(restArr, selectNum - 1);

const combineFix = permutationArr.map((v) => [fixed, ...v]);

result.push(...combineFix);

});

return result;

}

 

조합 코드

더보기

function combination(arr, selectNum) {

  const result = [];

  // num이 1일때는 각 요소를 이중 배열로 만듬

  // [1, 10, 1100, 1111]   =>   [[1],[10],[1100],[1111]]

  if (selectNum === 1return arr.map((v) => [v]);

 

  arr.forEach((v, idx, arr) => {

    // v = 현재 값

    const fixed = v;

    // 인덱스를 제외한 값을 배열로 만든다.

    // > Array [10, 1100, 1111]

    // > Array [1, 1100, 1111]

    // > Array [1, 10, 1111]

    // > Array [1, 10, 1100]

    const restArr = arr.filter((_, index) => index !== idx);

    // > Array [Array [10], Array [1100], Array [1111]] => [[10],[1100],[1111]]

    // > Array [Array [1], Array [1100], Array [1111]]

    // > Array [Array [1], Array [10], Array [1111]]

    // > Array [Array [1], Array [10], Array [1100]]

    const combinationArr = combination(restArr, selectNum - 1);

    // > Array [Array [1, 10], Array [1, 1100], Array [1, 1111]] => [[1,10],[1,1100],[1,1111]]

    // > Array [Array [10, 1], Array [10, 1100], Array [10, 1111]]

    // > Array [Array [1100, 1], Array [1100, 10], Array [1100, 1111]]

    // > Array [Array [1111, 1], Array [1111, 10], Array [1111, 1100]]

    const combineFix = combinationArr.map((v) => [fixed, ...v]);

    result.push(...combineFix);

  });

  return result;

}

728x90