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);
반드시 재귀를 사용해서 숫자 배열
[1, 2, ,[3, 4], 5]
의 모든 숫자를 프린트
slice
를 이용해서 새로운 배열로 만들어준다.O(N)
, O(log N)
, O(C^n)
의 시간복잡도 설명하기
배열에서 실행해야하는 요소가 늘어나는 것(배열이 커질수록) 에 비례해 실행해야하는 작업 수가 선형적으로 증가
base를 특정 횟수(exponent)만큼 거듭제곱하는 단계들은 조건문에 의해 연산 과정이 단축된다. (이 조건문이 어떻게 실행되는지 함께 설명했다.)
첫 라운드에 나온 요소(rock, paper, scissors 중 하나)를 기준으로 그 다음 라운드의 요소를 결정하는 재귀가 실행된다.
상위 클래스를 상속하여 하위 클래스를 만들 때, 상속된 메소드를 수정하는 것은 성공했지만, 하위 클래스에 해당 메소드가 존재하지 않는 문제를 해결하지 못했다. (또르르...)
하위 클래스 FlyingHorse
를 만들 때, 부모 클래스와 사용하는 방식이 다른 매개변수까지 같이 상속해버렸다.
class FlyingHorse extends Horse {
constructor(...) {
super();
...
}
}
또한 goSomewhere
이라는 같은 이름의 메소드로 destination
이라는 매개변수를 상속받지만, FlyingHorse
의 goSomewhere
메소드는 추가적인 기능(flying)을 가지고 있다.
goSomewhere(destination, milesToDestination) {
super.goSomewhere(this);
if (milesToDestination < 10) {
return this.destination;
} else {
return `${this.name} is flying to ${destination}!`
}
}
부모 클래스의 기능에서 상속받을 메소드에만 super()
를 사용해야한다.
super()
를 사용해서 다형성을 어떻게 구현하는 지constructor()
복습하기original 객체를 이용해 변경된 객체를 만들어내는 getChanged 함수 만들기
rest/spread
문법의 순서에 따라 변경되는 값이 달라진다는 것에 유의해서 문제를 풀었다. 변경하거나 덮어씌울 값이 rest의 뒤에 나온다.
Queue 클래스 구현하기 (단, 객체로 구현하며 추가 및 삭제는 O(1) 시간 복잡도로 구현되어야함.
element
는 클래스 객체의 tail
이 되고 객체의 마지막 값의 인덱스는 1이 늘어난다.head
)를 삭제하고 그 다음 요소가 head
가 된다.제일 힘들게 풀었던 문제
트리 자료구조이기때문에 무조건 중위순회 방식을 적용해야하나? 라는 생각으로 문제를 고민했었다. 그런데 도저히 할 줄 모르겠어서 map
의 기능과 콜백함수에 초점을 맞춰서 다시 처음부터 슈도코드를 작성했다.
Tree
클래스를 pseudo-classical한 방식으로 작성해서 addChild
메소드와 고차함수 map
구현하기
Tree = {
value:1,
children: [{value:2,
children:[{value:4,
children:[]}, {value:5,
children:[]}],
[{value:3,
children:[{value:6,
children:[]},{value:7,
children:[]}]}]
}
Object.create(Tree.prototype)
을 이용해 새로운 트리 인스턴스를 반한환다.
새로 만들어진 트리의 루트는 this.value
(원본 루트 값)에 콜백함수를 적용한 값이 된다.
새로운 트리 인스턴스의 children은 각 children의 엘리먼트(child)에 콜백함수를 적용(map)한 결과가 된다.
고차함수 map을 사용할 때 return 값으로 다시 map을 반환한다면?
playerNames()
메소드 만들기
반복문을 사용해서 모든 요소를 순회할 때까지 객체에서 필요한 값을 추출하고, 템플릿 리터럴로 결과값을 만들었다.