[Algorithm]Toy Problem 11

안정태·2021년 5월 1일
0

Algorithm

목록 보기
11/50
post-thumbnail

문제 : powerSet

하나의 집합을 의미하는 문자열을 입력받아 각 문자를 가지고 만들 수 있는 모든 부분 집합을 리턴

let output1 = powerSet('abc');
console.log(output1); // ['', 'a', 'ab', 'abc', 'ac', 'b', 'bc', 'c']

let output2 = powerSet('jjump');
console.log(output2); // ['', 'j', 'jm', 'jmp', 'jmpu', 'jmu', 'jp',
//'jpu', 'ju', 'm', 'mp', 'mpu', 'mu', 'p', 'pu', 'u']

문제의 접근

부분집합들의 집합을 구하는 문제다. 바로 생각나는 단어가 있다. 멱집합 당연하게도 멱집합을 구하는 문제다. '컴퓨터과학로드맵'을통해 멱집합은 개념을 확실히 익혔고 자료구조를 공부하면서 이미 한번 만들어 봤던 코드다. 때문에 생각보다 가볍게 구현을 할 수 있었다.

const powerSet = function (str) {
  // TODO: 여기에 코드를 작성합니다.
  let arr = str.split('').sort(); //문자열을 분리해서 배열로 만들어주고 정렬해준다.
  let result = [''] //결과가 담길 배열
  
  let aux = (target, result) => { //result에서 target을 추가한 인자들을 result에 추가해주는 함수
    let copy = result.slice();
    for(let i = 0; i < copy.length; i++){
      copy[i] += target;
      result.push(copy[i])
    }
    return result
  }

  for(let i = 0; i < arr.length; i++){ //arr의 값들을 전부 넣어서 aux함수 실행
    if(!result.includes(arr[i])){ //중복값이 아닌 경우에만 실시
      aux(arr[i], result)
    }
  }
  return result.sort(); //결과를 정렬해서 반환
};

위 주석을 읽으면서 내려오면 코드가 이해될 것이다.

문제를 통해 생각해 볼 것

'컴퓨터과학로드맵' 책을 통해서 보다 확실하게 멱집합의 개념을 이해하고 보다 간편하게 코드를 구현할 수 있게 된 것 같다. 물론 구현과정에서 몇몇 실수는 있었지만 충분히 문제점을 파악하고 해결할 수 있었다.

profile
코딩하는 펭귄

0개의 댓글