all subsets of a word (모든 부분 집합 찾기)

입력된 String에 대해서 모든 부분 집합을 찾는 코드이다.

여기서 Set을 썻는데 중복값 제거를 위해 사용했다.

  1. 한자만 들어올 경우 들어온 한자만 Set에 담아서 return 한다.
  2. 한자 이상일 경우 현재 값을 중심으로, 하기 3가지를 담는다. 
    • 현재 값
    • 들어온 값 전체
    • 현재 값 + 들어온 값 전체
  3. 담겨진 모든 값을 돌려준다.

예를 들자면 'ab' 2자가 들어왔을 경우

최초 현재 값은 a이고 나머지 값은 b가 된다. b는 한자임으로 즉각 리턴이 되고,

현재값 a 그리고 즉각 리턴된 b를 set에 담는다. 

그리고 현재값 a와 합산값 b를 합해서 set에 담음으로써

['a','b','ab']가 된다.

만약 'c'를 추가로 'cab'라고 하면

현재값 c와  상기 ['a','b','ab']를 더해서 추가 한다.

['a','b','ab', 'c', 'ca','cb','cab'] 가 되게 된다.

갯수는 2^3 - 1임으로 7개가 맞다.

단, 중복값 'aa' 가 들어올 경우 상기 갯수는 틀리게 된다.


function permutation(str) {
    let set = new Set();
    if (str.length == 1) {
        set.add(str);
        return set;
    }
    let cur = str.substring(0, 1);
    let nextList = permutation(str.substring(1));

    set.add(cur);
    for (let next of nextList) {
        set.add(next);
        set.add(cur + next);
    }
    return set;
}
let input = "abcdefghij";
let result = permutation(input);

console.log(result.size == Math.pow(2,input.length)-1);
728x90
반응형