오늘 한일

아직 로또와 사다리 둘 다 피드백을 받지 못했다. 바쁘시니까 어쩔 수 없는 듯.....

백준 DP: 쉬운 계단 수, 오르막 수

백준 dp관련 문제를 2개 풀었다. 이번엔 최대한 점화식을 구하려고 노력해봤다. 다행히 두 문제 모두 30분 내에 점화식을 구할 수 있었다.

코딜리티나 프로그래머스는 메인 함수를 직접 작성하지 않아도 되지만, 백준 사이트에서는 메인 함수를 직접 작성해야 한다. 사용자 입력을 처리하는 과정에서 항상 Sanner를 사용했는데, 다른 사람의 풀이를 찾아보니 주로 BufferedReader와 BufferedWriter를 사용한다는 것을 알 수 있었다. 400ms 였던 풀이가 200ms 대로 떨어진 걸 보면 Scanner를 쓰는 것보다 성능이 꽤 좋은 것 같다.

함수형 프로그래밍과 Javascript ES6+: L.map, L.filter

제네레이터/이터레이터 프로토콜을 이용하여 지연평가 기능을 지원하는 map와 filter를 구현하는 방법에 대해 공부했다.

/* 제네레이터/이터레이터 프로토콜로 구현하는 지연평가 */

// 지연평가는 게으른 평가라고도 하지만 영리하다고도 한다
// 게으르지만 최대한 영리하게 평가하는 방법
// 제때 계산법: 필요할 때까지 평가를 미루다가 필요한 순간에 해당하는 코드들을 평가하면서 값을 만들어나가는 기법으로 값을 만드는 것을 최소화하고 연산을 줄이는 기법이다.

// 언어 자체에서 해당하는 로직을 구현할 수 있도록 기반이 되는 프로토콜이 없었지만 (별도의 연산을 추가해서 구현해야 했음) 제너레이터와 이터레이터 이터러블 프로토콜을 기반으로 일반적인 기법으로 지연평가를 구현할 수 있게 되었다. (이터러블 중심 프로그래밍)

// 지연성을 가진 map -> L.map
// 평가를 미루는 성질을 갖고 평가 순서를 달리 조작할 수 있는 준비가 되어있는 이터레이터를 반환하는 제너레이터 함수
console.clear();

L.map = function *(f, iter) {
  for (const a of iter) yield f(a);
};

var it = L.map(a => a + 10, [1, 2, 3]);
// log(it.next());
// log(it.next().value);
log([...it]);

// 지연성을 가진 filter -> L.filter
// 역시 제너레이터를 통해서 구현
console.clear();

// 원하는 상황에서만 yield됨
L.filter = function *(f, iter) {
  for (const a of iter) if (f(a)) yield a;
};

var it = L.filter(a => a % 2, [1, 2, 3, 4]);
log(it.next());
log(it.next());
log(it.next());

플러터 1/4/7/14 앱 디자인 구상

카카오 오븐 으로 대충 디자인만 해봤다. 이제 기능만 구상하고 플러터로 개발해봐야지

오늘 느낀점

dp 2문제나 혼자 힘으로 풀었다. 슬슬 익숙해지는 것 같긴 한데, 문제 분류를 모르는 상태에서도 케이스를 모두 통과하는 코드를 작성할 수 있을지는 의문

내일 할일

  • nextstep 4주차 수업 참여
  • 로또 3단계 merge (아마도?) & 로또 4단계 피드백 요청
  • 사다리 1단계 피드백 반영
  • 플러터 1/4/7/14 앱 기능 설계