본문 바로가기
알고리즘/잡기술

JavaScript 조합 구현하기

by SeungYn 2023. 1. 26.

어짜피 또 까먹을 미래의 나에게.

이걸 보러 왔다면, 또 까먹었구나.

일단 코드부터 보자

function combinations(arr, selectNumber) {
  const result = [];

  if (selectNumber === 1) return arr.map((el) => [el]);

  arr.forEach((fixed, index, origin) => {
    const rest = origin.slice(index + 1);
    const cms = combinations(rest, selectNumber - 1);
    const attached = cms.map((el) => [fixed, ...el]);
    result.push(...attached);
  });

  return result;
}

 

오랜만에 봐서 또 모르겠지. 네모 칸을 보면서 왜 arr.map((el) => [el]) 리턴 할 때 [el]로 하지라고 볼 때마다 의문을 가지겠지만. 

화살표가 가르키는 라인을 위한 큰 그림이야.

 

[1,2,3,4] 중에 3개를 뽑는다고 해보자. 그럼 1,2는 앞에서 선택되어서 고정이 되었기 때문에 3,4에서 하나씩 고르면 되겠지?

그럼 cms의 값은 [[3].[4]]가 되어있을 꺼야. 그래서 바로 다음 라인에서 cms를 돌아서 [[2,3],[2,4]]를 반환하겠지. 여기서 1은 앞에서 고정시켜 두었다고 생각하면 돼. 즉 앞에서 1을 사용했으니깐 현재 우리는 [2,3,4] 중에서 2를 고정시켜서 조합을 구하는 거야 그럼 2개를 선택했느니깐 나머지 1개만 선택하면 되기 때문에 [el] 리턴을 해주는 거야.

혹시 몰라 까먹었을까봐 적어두는데 selectNumber은 현재 선택해야할 원소의 갯수야. 그럼 이만 만약 내가 적지 설명하지 않은 부분을 까먹었으면 그 때 추가해줘.

From 과거의 내가.

'알고리즘 > 잡기술' 카테고리의 다른 글

배열에서 유효한 index인지 검사 편하게 하기  (0) 2023.04.05