티스토리 뷰

카테고리 없음

PowerSet 알고리즘

나아눙 2023. 3. 28. 10:52
const powerSet = function (str) {
  // 정렬
  const sorted = str.split('').sort();
  //각자 문자로 분리하여 알파벳 정렬 후 배열에 저장한다.
  // 중복 제거
  const deduplicated = sorted.reduce((acc, item) => {
    //첫번째는 이전까지의 계산 결과를 누적하는 변수
    //두번째는 배열의 요소 하나
    if (acc[acc.length - 1] === item) {
      return acc;
    } else {
      return acc.concat(item);
    }
  });

  let subSets = [];
  const pickOrNot = (idx, subset) => {
    // base case
    if (idx === deduplicated.length) {
      // 마지막 문자까지 검토한 경우
      subSets.push(subset);
      return;
    }

    // recursive case
    // idx번째 문자가 포함되지 않는 경우
    pickOrNot(idx + 1, subset);

    // idx번째 문자가 포함되는 경우
    pickOrNot(idx + 1, subset + deduplicated[idx]);
  }; 

  pickOrNot(0, '');

  return subSets.sort();
};

subSets 변수는 부분집합을 저장하는 배열이다.

pickOrNot 함수는 재귀적으로 호출되는데

idx는 현재 검토할 문자의 인덱스를 나타내고,

subset은 이전까지 선택한 문자열의 부분집합을 나타낸다.

pickOrNot 함수에서는 두 가지 경우를 모두 검토한다.

첫번째 경우는 idx번째 문자를 선택하지 않는 경우: pickOrNot(idx + 1, subset)를 호출합니다.

두번째 경우는 dx번째 문자를 선택하는 경우: pickOrNot(idx + 1, subset + deduplicated[idx])를 호출합니다. 이때 subset 문자열에 deduplicated[idx]를 추가한다.

idx가 문자열의 마지막 인덱스인 경우(base case), subSets 배열에 subset을 추가한다.

이러한 방식으로 모든 부분집합을 찾아 subSets 배열에 저장한다.

ex) let str = 'abc'

중복을 제거하고 알파벳순으로 정렬한 deduplicated 배열은 ['a', 'b', 'c']가 됩니다.

 

idx번째 문자가 포함되지 않는 경우
처음에는 pickOrNot(0, '') 함수를 호출합니다. 이때 idx는 0이고, subset은 빈 문자열('')이다.

pickOrNot(1,"")
pickOrNot(2,"")
pickOrNot(3,"")로 

idx는 deduplicated의 길이와 같으므로 subset는 빈배열이 추가된다.

 

idx번째 문자가 포함된 경우

pickOrNot(1,"" + a)

pickOrNot(2,""+ a)

pickOrNot(3,""+ a)

 

subset = ["" , 'a"]

 

 

 




Regenerate response

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함