Basic CS HA [Tree Map]

dlrbwls0302·2021년 1월 28일
0

Pseudo-classical한 방식으로 TreeMaker 함수를 완성하고, 거기에 들어가는 addChild 메소드와 map 메소드를 완성하세요.

내 코드:

const TreeMaker = function (value) {
  this.value = value;
  this.children = [];
};

TreeMaker.prototype.addChild = function(child) {
  let newNode = new TreeMaker(child);
  this.children.push(newNode);
  return newNode;
  
};

TreeMaker.prototype.map = function(callback) {
  const temp = new TreeMaker(this.value);
  temp.value = callback(this.value);
  temp.children = [];
  if(this.children.length !== 0){
    for(let i = 0; i < this.children.length; i++){
      temp.children[i] = this.children[i].map(callback);
    }
  }
  
  return temp;
};

입출력 예시:

let root1 = new TreeMaker(1); // root1 === { value: 1, children: [] }
let branch2 = root1.addChild(2); 
// root1 === { value: 1, children: [{ value: 2, children: [] }] }
// branch2 === { value: 2, children: [] }
let branch3 = root1.addChild(3);
// root1 === { value: 1, children: [{ value: 2, children: [] }, { value: 3, children: [] }] }
// branch3 === { value: 3, children: [] }

1. 어려웠던 이유는?

풀고나서 보면 어렵지는 않은데 풀때는 사실 어려웠다. 나는 Data Structure 스프린트가 어려웠기 때문에 문제를 다 풀면 싹 다 지우고 다시 풀어보기를 3~4번 이상은 한 것 같다. 자료 구조에 대한 문제가 나올 걸 알고 있었기 때문에 자료 구조에 약했던 내가 할 수 있는건 문제를 최대한 반복해서 풀어보며 그 느낌을 내 것으로 흡수하는 것이였다. 이렇게 많이 반복해서 풀고 hash table 같은 문제는 실제로 많은 시간을 삽질해서 풀다보니 마지막에 풀때는 술술 풀었다.

본 문제가 어렵다기 보다는 조건을 두어 (예를 들어 map 메소드의 경우 원본은 놔두고 callback 함수가 적용된 새로운 객체를 만들어 내는 등) 아주 조~금 꼬아놨기 때문에 기초가 부족했다면 정말로 못 풀었을 것 같다는 생각이 들었다. 다행히 본 문제의 map 메소드의 경우 Data Structure 스프린트의 part3에 있었던 Binary Search Tree 문제와 유사해던게 도움이 되었다.

내가 map 메소드를 구현한 방식은 이렇다. 먼저 조건 중 하나인 원본 객체를 복사한 새로운 객체를 만들되, TreeMaker 함수의 인스턴스여야 한다는 점 때문에 TreeMaker 함수에 new 키워드를 이용해서 temp 객체를 하나 만들었고 그 객체의 value로 원본 객체의 value에 콜백 함수를 적용한 값을 할당했다. 이렇게 되면 원본 객체의 value가 1이고 콜백 함수가 값을 두 배로 만들어 준다고 했을때 새로 만들어진 객체 temp의 value는 2가 된다.

그 다음 자식 노드에도 콜백 함수를 적용해서 temp의 자식으로 넣어주어야 하기 때문에 for문을 이용해서 자식 노드들에 접근했고 콜백 함수를 적용한 값을 순차적으로 temp의 자식으로 넣어주었다. 이렇게 해서 첫 번째 조건인 원본 건드리지 않기와 두 번째 조건인 TreeMaker의 인스턴스이자 원본의 객체에 콜백 함수가 적용된 값을 반환할 수 있었다.

2. Reference

const TreeMaker = function (value) {
  this.value = value;
  this.children = [];
};

TreeMaker.prototype.addChild = function(child) {
  if (!child || !(child instanceof TreeMaker)) {
    child = new TreeMaker(child)
  }

  this.children.push(child)

  return this
};

TreeMaker.prototype.map = function(callback) {
  return this.children.reduce(function (tree, child) {
    return tree.addChild(child.map(callback))
  }, new TreeMaker(callback(this.value)))
};

3. Feedback

레퍼런스 코드는 아주 간결하고 창의적인 방법으로 해결했다. 나는 솔직히 배열 문제를 풀 때 map, filter, reduce와 같은 메소드를 많이 쓰는 편이 아니다. 프리 코스 때는 코플릿이나 HA를 위해 어쩔 수 없이 많이 썼고 열심히 공부도 했지만 프리 코스 이후로는 사실 쓸 일이 별로 없다고 생각했고, 안쓰다보니 점점 더 낯설게 느껴졌다. 그런데 레퍼런스 코드를 보니 map과 reduce 메소드를 사용하여 뭔가 더 간단하게 문제를 해결한 것 같아서 나도 앞으로 배열 문제가 나오면 이 메소드들을 써보기로 다짐했다.

profile
오늘의 공부가 쌓여서 내일의 나를 만들어낸다.

관심 있을 만한 포스트

0개의 댓글