Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript로 여러 배열의 데카르트 곱 구하기 – 대시(-)로 구분된 모든 조합 생성 방법

JavaScript에서는 임의 개수의 배열을 입력받아 각 배열의 요소들로 이루어진 데카르트 곱(Cartesian Product)을 계산하고, 각 요소를 대시(-)로 연결한 문자열 배열을 반환하는 함수를 작성할 수 있습니다.

예를 들어 세 개의 배열이 주어졌을 때, 첫 번째 배열의 요소 × 두 번째 배열의 요소 × 세 번째 배열의 요소로 만들 수 있는 모든 조합을 하나의 문자열로 합쳐서 결과 배열에 담아 반환하는 것이 목표입니다.

구현 코드

아래 코드는 reduce()map()을 활용해 가변 개수의 배열에 대해 데카르트 곱을 계산합니다.

const arr1 = ['a', 'b', 'c', 'd'];
const arr2 = ['1', '2', '3'];
const arr3 = ['x', 'y'];

const dotCartesian = (...arrs) => {
  const res = arrs.reduce((acc, val) => {
    let ret = [];
    acc.map(obj => {
      val.map(obj_1 => {
        ret.push(obj + '-' + obj_1);
      });
    });
    return ret;
  });
  return res;
};

console.log(dotCartesian(arr1, arr2, arr3));

코드 동작 원리

이 함수가 작동하는 방식은 다음과 같습니다.

1단계: ...arrs 나머지 매개변수(rest parameter)를 사용해 전달된 모든 배열을 하나의 배열로 받습니다. 덕분에 배열이 몇 개든 상관없이 호출할 수 있습니다.

2단계: reduce()가 배열들을 순회하며 누적값(acc)과 현재 배열(val)을 결합합니다. 초기 누적값은 첫 번째 배열 자체입니다.

3단계: 각 단계에서 누적된 문자열 조합(acc)의 모든 요소와 현재 배열의 모든 요소를 이중 map()으로 짝지어, 대시(-)로 연결한 새 문자열을 만듭니다.

4단계: 모든 배열이 처리되면 최종적으로 완성된 조합 배열이 반환됩니다.

실행 결과

콘솔에 출력되는 결과는 다음과 같습니다.

[
  'a-1-x', 'a-1-y', 'a-2-x',
  'a-2-y', 'a-3-x', 'a-3-y',
  'b-1-x', 'b-1-y', 'b-2-x',
  'b-2-y', 'b-3-x', 'b-3-y',
  'c-1-x', 'c-1-y', 'c-2-x',
  'c-2-y', 'c-3-x', 'c-3-y',
  'd-1-x', 'd-1-y', 'd-2-x',
  'd-2-y', 'd-3-x', 'd-3-y'
]

총 4 × 3 × 2 = 24개의 조합이 대시로 구분된 문자열 형태로 출력됩니다. 이처럼 reduce() 기반 접근 방식은 배열의 개수와 길이에 유연하게 대응할 수 있어, 실무에서 SKU 코드 생성, 옵션 조합 생성 등 다양한 경우에 활용할 수 있습니다.