본문 바로가기
2. 우당탕탕 개발자/2-1. 공부기록

13Dec2019 TIL

by Little Monkey 2019. 12. 14.
반응형

Today I learned : 

  • Figured out the reason why the recursion function I made did not work properly, while implementing Tree data structure in functional shared methods style.
  • Done with implementation of Graph data structure

더보기

3일동안 티스토리의 글쓰기 기능을 알 수 없는 이유로 사용할 수 없어 블로그를 폭파하고 새로운 채널을 이용해야 하나 고민하는 동안에, 드디어 글쓰기 기능을 사용할 수 있게 되어 기쁜 마음으로 TIL 을 남긴다. 아직도 블로그의 관리 기능은 사용할 수 없는 상태인데, 어서 빨리 해결 되었으면 좋겠다.

며칠 째 컨디션 난조에 오늘은 고객사와 회식까지 해서 피곤한 와중에 조금이라도 자리에 앉아 어제 마무리 짓지 못했던 '그래프 일부 메소드 구현'과 '트리의 엘리먼트 찾는 메소드 구현'을 드디어 마무리 지었다. 특히나 트리 매소드의 경우 2일째 해당 기능을 원하는데로 구현하지 못해 답답했는데, 회식의 술기운으로 자리에 앉아 푸니 몇 번의 시도 만에 풀렸다... 술을 먹으니 피곤은 해도 머리는 빨리 회전되는 느낌은.. 단지 느낌일 뿐인가 ㅎㅎㅎ 애주가 스멜 ㅎㅎㅎ

 

 

기본 전제 조건은 다음과 같다. functional - Shared style 로 작성하였다. 해당 기능은 문제 없이 작동 되었다.

 

const Tree = function(value) {
  const newTree = {};

  newTree.value = value;
  newTree.children = [];

  extend(newTree, treeMethods);
  return newTree;
};

var extend = function(from, to) {
  for (let key in to) {
    from[key] = to[key];
  }
};

const treeMethods = {};

 

 

하단의 코드는 내가 며칠동안 구현에 난항을 겪었던 For loopRecursion 의 조합이다. 

 

treeMethods.contains = function(target) {
  let recurse = function(node) {
    let result;
    for (let i = 0; i < node.length; i++) { 		//여기에서 문제 시작
    console.log(i)			// loop가 제대로 작동하는지 확인
      if (node[i].value === target) result =  true;
      else if (node[i].children.length) result = recurse(node[i].children);
      else result = false;
    }
    return result;
  };
  return recurse(this.children);
};

 

i = 0 인 노드의 값은 정상적으로 boolean 값을 리턴했지만, i > 0 일때는 무조건 false 만 리턴했다. 

문제의 원인을 파악하기 위해 for loop 다음에 console.log(i) 를 이용해 loop가 제대로 작동하는지 살펴보았다.

그랬더니 모든 노드가 아닌 일부 노드만 반복하다가 실행을 멈춰버렸다.

 

이유 중 하나는, 

일단 result 값이 true로 바뀌면, 즉시 true값을 리턴해 내야 하지만

이 함수에 따르면 result 의 값이 수시로 true - false 로 변화하며 마지막노드의 결과에 따라 최종 값이 좌우된다.

=> 한번 true 값이 나오면, 최종 결과 값이 true 한 값을 리턴하는 함수를 구현해야 했다.

 

 

treeMethods.contains = function(target) {
  let sum = 0;			// 한번이라도 true 값을 가지면 sum >0이 된다.
  let recurse = function(node) {
    for (let i = 0; i < node.length; i++) {
      if (node[i].value === target) sum++;
      else recurse(node[i].children);
    }
    return sum > 0 ? true : false;
  };
  return recurse(this.children);
};

 

 

각 노드를 순회하며, target 과 같은 값이 나오면 외부함수의 sum의 값이 증가된다.

모든 노드를 순회하고 난 뒤 sum 의 값을 보고 boolean 값을 리턴한다.

반응형

'2. 우당탕탕 개발자 > 2-1. 공부기록' 카테고리의 다른 글

15Dec2019 TIL  (0) 2019.12.15
14Dec2019 TIL  (0) 2019.12.14
11Dec2019 TIL  (0) 2019.12.14
10Dec2019 TIL  (0) 2019.12.14
09Dec2019 TIL  (0) 2019.12.10

댓글