오늘 한일

사다리 1단계 구현

사다리 타기가 정상적으로 동작하려면 라인이 겹치지 않도록 해야 한다.

부울값 하나를 랜덤으로 생성하는 boolean generator와 해당 generator를 이용하여 겹치지 않는 부울목록을 생성하는 booleans generator를 이용해서 구현했다.

// test
@Test
public void test_참이_겹치지_않는_부울목록_생성() {
    BooleansGenerator generator = new NonContinuousGenerator(() -> true, true);

    assertThat(generator.generate(6))
            .isEqualTo(Arrays.asList(true, false, true, false, true, false));
}

@Test
public void test_거짓이_겹치지_않는_부울목록_생성() {
    BooleansGenerator generator = new NonContinuousGenerator(() -> false, false);

    assertThat(generator.generate(6))
            .isEqualTo(Arrays.asList(false, true, false, true, false, true));
}

// 생성기
@Override
public List<Boolean> generate(int size) {
    Stack<Boolean> stack = new Stack<>();
    stack.push(booleanGenerator.getAsBoolean()); // 겉으로 드러나지 않음

    for (int i = 1; i < size; i++) {
        addNonContinuous(stack);
    }
    return new ArrayList<>(stack);
}

그러나, 조금 애매한 부분이 존재한다. 구현을 봐야만 결과의 시작값이 booleanGenerator로 생성한 부울값이라는 것을 알 수 있다. 어떻게 겉으로 드러낼 수 있을까....

백준 DP: 1, 2, 3 더하기

백준 dp관련 문제를 1개 풀었다. 점화식을 사용하지는 않았고, 이전 단계의 결과와 덧셈을 수행하는 방식으로 풀었지만 처음으로 dp 문제를 혼자 힘으로 풀었다. 다른 사람의 풀이를 찾아보니 점화식을 이용한 코드가 있었고, 속도 차이는 별로 나지 않았다.

함수형 프로그래밍과 Javascript ES6+: take

22일날 공부했던 Lazy Evaluation와 Eager Evaluation를 take 함수와 함께 사용하는 방법과 효율성에 대해 공부했다.

// 10000개를 미리 만들고 5개를 뽑음
// 약 0.8ms ~ 2ms
console.time('range&take');
go(
  range(10000),
  take(5),
  reduce(add),
  log);
console.timeEnd('range&take');


// 지연성을 가지는 값을 이터레이터로 만든다면 잘 조합을 할 수거 있음
// 5의 값만 만듬, 효율성적인 측면에서 훨씬 나음
// 약 0.2ms ~ 0.4ms
console.time('L.range&take');
go(
  L.range(10000),
  take(5),
  reduce(add),
  log);
console.timeEnd('L.range&take');

// 무한수열도 가능
// go(
//   L.range(Infinity),
//   take(5),
//   log);

오늘 느낀점

사다리 1단계는 게임 진행도 없이 사다리를 만들기만 하는건데도 거의 4시간이나 걸려서 자괴감을 느꼈다. 1~2시간만에 뚝딱 만드는 사람들도 있겠지...

내일 할일

  • 로또 3단계 merge (아마도?) & 로또 4단계 피드백 요청
  • 사다리 1단계 피드백 반영