Basic CS HA Review Note

devPomme·2021년 1월 29일
0

Recursion

HA를 보기 전날 새벽에 재귀함수를 심화(?) 학습할 기회가 생겼다.
기깔 나는 코드를 알려주신 시청자분께 감사드린다... 덕분에 거의 세 시간동안 이해하려고 애를 쓴 거 같다.
방송을 시청하시던 다른 동기님이 친절하게 설명해주셨다!

function rangeSum( a, flag ) {
    console.log(flag+" : "+a);
    if ( a <= 1 ) {
        console.log("리턴!");
        console.log("-----");
        return a;
    }
    console.log("재귀!");
    console.log("-----");
    return rangeSum( a-1, "A" ) + rangeSum( a-3, "B" );
}

var sum = rangeSum(6, "S");
console.log("sum", sum);

problem

반드시 재귀를 사용해서 숫자 배열[1, 2, ,[3, 4], 5]의 모든 숫자를 프린트

how to solve

  1. slice를 이용해서 새로운 배열로 만들어준다.
  2. 새로운 배열의 요소가 배열인 경우 재귀함수 실행
  3. 그렇지 않을 경우, 요소가 숫자인 경우 결과값(문자열) 에 요소를 추가한다.

Algorithm

problem

O(N), O(log N), O(C^n)의 시간복잡도 설명하기

how to solve

  1. 배열에서 실행해야하는 요소가 늘어나는 것(배열이 커질수록) 에 비례해 실행해야하는 작업 수가 선형적으로 증가

  2. base를 특정 횟수(exponent)만큼 거듭제곱하는 단계들은 조건문에 의해 연산 과정이 단축된다. (이 조건문이 어떻게 실행되는지 함께 설명했다.)

  3. 첫 라운드에 나온 요소(rock, paper, scissors 중 하나)를 기준으로 그 다음 라운드의 요소를 결정하는 재귀가 실행된다.

Inheritance

problem

상위 클래스를 상속하여 하위 클래스를 만들 때, 상속된 메소드를 수정하는 것은 성공했지만, 하위 클래스에 해당 메소드가 존재하지 않는 문제를 해결하지 못했다. (또르르...)

how to solve

내가 작성한 코드

하위 클래스 FlyingHorse를 만들 때, 부모 클래스와 사용하는 방식이 다른 매개변수까지 같이 상속해버렸다.

class FlyingHorse extends Horse {
  constructor(...) {
    super();
    ...
  }
}

또한 goSomewhere이라는 같은 이름의 메소드로 destination이라는 매개변수를 상속받지만, FlyingHorsegoSomewhere 메소드는 추가적인 기능(flying)을 가지고 있다.

 goSomewhere(destination, milesToDestination) {
    super.goSomewhere(this); 
    if (milesToDestination < 10) {
      return this.destination;
    } else {
      return `${this.name} is flying to ${destination}!`
    }
  }

부모 클래스의 기능에서 상속받을 메소드에만 super()를 사용해야한다.

Conclusion

  • ES6에서 클래스를 상속할 때 super() 를 사용해서 다형성을 어떻게 구현하는 지
  • 생성자 함수 constructor() 복습하기

Destructuring

problem

original 객체를 이용해 변경된 객체를 만들어내는 getChanged 함수 만들기

how to solve

rest/spread 문법의 순서에 따라 변경되는 값이 달라진다는 것에 유의해서 문제를 풀었다. 변경하거나 덮어씌울 값이 rest의 뒤에 나온다.

Queue

problem

Queue 클래스 구현하기 (단, 객체로 구현하며 추가 및 삭제는 O(1) 시간 복잡도로 구현되어야함.

how to solve

  1. head와 tail 값 만들기
  2. 추가 기능: 매개변수 element는 클래스 객체의 tail이 되고 객체의 마지막 값의 인덱스는 1이 늘어난다.
  3. 제거기능: 빈 배열인 경우를 제외하고, 객체의 첫번째 요소(head)를 삭제하고 그 다음 요소가 head가 된다.

Tree-map

제일 힘들게 풀었던 문제
트리 자료구조이기때문에 무조건 중위순회 방식을 적용해야하나? 라는 생각으로 문제를 고민했었다. 그런데 도저히 할 줄 모르겠어서 map의 기능과 콜백함수에 초점을 맞춰서 다시 처음부터 슈도코드를 작성했다.

problem

Tree 클래스를 pseudo-classical한 방식으로 작성해서 addChild 메소드와 고차함수 map 구현하기

how to solve

  1. 트리를 객체로 구현하기
 Tree = {
   value:1, 
   children: [{value:2, 
               children:[{value:4, 
                          children:[]}, {value:5,
                                         children:[]}],
             [{value:3,
               children:[{value:6, 
                          children:[]},{value:7, 
                                        children:[]}]}]
         }

1. addChild 메소드 구현

  1. Tree 클래스로 새로운 노드 만들기
  2. 새로운 트리의 children 속성에

2. map 고차함수 구현

  1. Object.create(Tree.prototype)을 이용해 새로운 트리 인스턴스를 반한환다.

  2. 새로 만들어진 트리의 루트는 this.value (원본 루트 값)에 콜백함수를 적용한 값이 된다.

  3. 새로운 트리 인스턴스의 children은 각 children의 엘리먼트(child)에 콜백함수를 적용(map)한 결과가 된다.

Conclusion

고차함수 map을 사용할 때 return 값으로 다시 map을 반환한다면?

this

problem

playerNames() 메소드 만들기

how to solve

반복문을 사용해서 모든 요소를 순회할 때까지 객체에서 필요한 값을 추출하고, 템플릿 리터럴로 결과값을 만들었다.

profile
헌신하고 확장하는 삶

0개의 댓글