fullfish 2022. 6. 14. 15:43

조합의 개수 공식

 

구글링해보니 여러가지 코드가 나왔다

 

예시 2가지

function combination(arr, selectNum) {
  const result = [];
  if (selectNum === 1) return arr.map((v) => [v]);
  arr.forEach((v, idx, arr) => {
    const fixed = v;
    const restArr = arr.slice(idx + 1);
    const combinationArr = combination(restArr, selectNum - 1);
    const combineFix = combinationArr.map((v) => [fixed, ...v]);
    result.push(...combineFix);
  });
  return result;
}
const conbination = (arr, bucket, n) => {
  if (n === 0) {
    console.log(bucket);
    return;
  }

  for (let i = 0; i < arr.length; i++) {
    const choice = arr[i];
    const sliceArr = arr.slice(); // 재귀
    conbination(sliceArr.slice(i + 1), bucket.concat(choice), n - 1);
  }
};
conbination([1, 2, 3, 4], [], 3);

해당 코드들로 개념을 익히고

순열에서 만들었던 코드의 골격대로 바꿔보았다

 

코드

// 조합
function solution(arr, n) {
  let result = []
  function combination(n, tempArr, arr) {
    if (n === 0) return result.push(tempArr.slice())
    for (let i = 0; i < arr.length; i++) {
      combination(n - 1, tempArr.concat(arr[i]), arr.slice(i + 1))
    }
  }
  combination(n, [], arr)
  return result
}
// 중복조합
function solution2(arr, n) {
  let result = []
  function combination(n, tempArr, index) {
    if (n === 0) return result.push(tempArr.slice())
    for (let i = index; i < arr.length; i++) {
      combination(n - 1, tempArr.concat(arr[i]), i)
    }
  }
  combination(n, [], 0)
  return result
}
console.log(solution([1, 2, 3, 4], 3));
// 결과
[ [ 1, 2, 3 ], [ 1, 2, 4 ], [ 1, 3, 4 ], [ 2, 3, 4 ] ]