오늘 한일

  • 오늘자 오전 미팅 내용 중 체크 사항

    • 리펙토링 가장 중요하다. 처음부터 완벽하게 짤려고 하지 말고 리펙토링으로 해결 하면 된다.

    • 실무에서는 기능 하나하나 마다 브랜치를 새로만든다.

  • 오늘자 볼링 진행 사항
    • 각 플레이어가 10프렘임까지 진행 하게 구현 완료

    • 스트라이크/스페어 고려 없는 누적 점수 구현 완료

    • 남은 내용: 스트라이크/스페어를 고려한 점수 계산, LastFrame 클래스 구현

  • 넥슨 코딩테스트 문제를 풀어봤다.

오늘 느낀점

  • 오랜 고민을 하고 짜는 이유가 잘 짜고 싶어서 욕심을 내는 건데, 처음부터 완벽하게 짜고 싶은 욕심을 내지 말고 리펙토링을 통해 잘 짜여진 코드로 개선 해 나가는 방식의 습관을 들이자.
    (구조 자체를 못짜서 시작을 못하는게 아니라 보통, 이게 낫지 않을까? 저게 더 효율적 인거 같은데 식의 무한 루프에 빠지는 편이였다.)

  • 넥슨 코딩테스트 문제를 풀어봤는데 세문제 중 한 문제 빼고는 풀만했던거 같다. 지원도 안하고 봤던 이유는 볼링 점수 구현에서 막혀서 휴식 차원에서 풀었는데, 테스트 이후 다시 볼링 점수 구현을 하니 막혔던 부분이 후딱 처리 됐다. 다음에도 막히는 일이 있으면 다른 것 좀 하다 와야겠다.

  • 볼링 구현하면서 다시 느꼈지만 메소드에 여러 기능을 넣지 않고 잘 쪼개놓으면 변경이 필요한 일부분만 바꿔도 문제 없이 잘 돌아간다. 그럴때마다 잘 하고 있는거 같아 즐겁다.

  • 개인적으로 테스트 코드가 가장 편하다고 느껴질때는 지금 짜고 있는 Player -> Frame -> Score 식의 계층적인 구조에서 Score에 변경이 생겼을 때다. 기존에 작성해 놓은 상위 클래스의 테스트 코드가 아무 문제 없이 초록불이 켜지는 것을 볼때이다. 일부의 변화가 부분적으로는 잘 돼도 나비효과로 전체에 문제를 일으킬 수도 있는데 문제가 없다는 걸 알수 있다. 덕분에 불필요한 확인 절차를 안해도 된다. TDD에 익숙해 질수록 참 효율적인거 같다.

  • 알고리즘 강의를 아직 안들었다. 매일 공부의 시작이 알고리즘 강의 였는데 하루 일과가 바껴서 언제 들을까 갈피를 못잡고 있다. 다른 사람들과의 진도도 있고 해서 오늘은 쉴까 싶은데 매일 듣던걸 안들으니 찝찝하다. 아무래도 안되겠다 듣고 자야겠다.

  • 블로그쪽 파일들만 Atom으로 작성 후 터미널로 git 작업들을 했는데 앞으로는 이클립스에서 작업하는 내용들도 터미널을 이용하자.

내일 할일

  • 알고리즘 강의 듣기

  • 콘솔 볼링 게임의 남은 기능들을 구현 완료 하자

인프런의 영리한 프로그래밍을 위한 알고리즘 강좌를 보고 작성한 문서입니다.

DELETE

Case 1:

bst_delete

Case 2:

bst_delete2

Case 3:

bst_delete3


삭제의 예

bst_delete_sample

수도코드

bst_delete_code


BST

  • 각종 연산의 시간복잡도 O(h)

  • 그러나, 최악의 경우 트리의 높이 h=O(n)

  • 균형잡힌(balanced) 트리

    • 레드-블랙 트리 등

    • 키의 삽입이나 삭제시 추가로 트리의 균형을 잡아줌으로써 높이를 O(logn)으로 유지

오늘 한일

  • 알고리즘 강의의 이진검색 트리에 대해 공부했다. (포스팅)

  • 콘솔상의 볼링 게임을 다시 구현하기 시작

오늘 느낀점

  • 밤낮이 바껴 있었던지라 네시간만 자고 와서 너무 피곤했다. 그래서 이전에 짜던 볼링 게임의 코드가 도저히 눈에 안들어와서 다시 처음부터 짜기 시작했다.

  • 좋은 구조로 짜고 싶다는 욕심에 생각만 많이하고 진도를 못나가는거 같다. 생각을 줄이고 행동을 해보자.

내일 할일

  • 알고리즘 강의 듣기

  • 볼링 게임 마저 구현(콘솔 상에서는 마무리 하자)

인프런의 영리한 프로그래밍을 위한 알고리즘 강좌를 보고 작성한 문서입니다.

최소값 찾기

TREE-MININUM(x)
1   while left[x] != NIL
2     do x <- left[x]
3   return x

최소값은 항상 가장 왼쪽 노드에 존재
시간복잡도: O(h)

최대값 찾기

TREE-MININUM(x)
1   while right[x] != NIL
2     do x <- right[x]
3   return x

최소값은 항상 가장 오른쪽 노드에 존재
시간복잡도: O(h)


Successor

  • 노드 x의 successor란 key[x]보다 크면서 가장 작은 키를 가진 노드

  • 모든 키들이 서로 다르다고 가정

    successor

3가지 경우

  • 노드 x의 오른쪽 부트리가 존재할 경우, 오른쪽 부트리의 최소값.

  • 오른쪽 부트리가 없는 경우, 어떤 노드 y의 왼쪽 부트리의 최대값이 x가 되는 그런 노드 y가 x의 successor

    • 부모를 따라 루트까지 올라가면서 처음으로 누군가의 왼쪽 자식이 되는 노드(위의 그림상에서 13과 15)
  • 그런 노드 y가 존재하지 않을 경우 successor가 존재하지 않음(즉, x가 최대값)

수도코드

TREE-SUCCESSOR(x)
1   if right[x] != NIL
2     then return TREE-MINIMUM(right[x])
3   y <- p[x]
4   while y != NIL and x = right[y]
5     do x <- y
6        y <- p[y]
7   return y

시간복잡도: O(h)


Predecessor

  • 노드 x의 predecessor란 key[x]보다 작으면서 가장 큰 키를 가진 노드

  • Successor와 반대


INSERT

bst_insert

삽입이 일어나는 과정

bst_insert2

수도코드

bst_insert_code

시간복잡도: O(h)

오늘 한일

오늘 느낀점

  • AJAX, JSON 강의 수강평이 좋아서 기대를 하고 봤는데, 아쉽게도 코드 중심적으로 실습을 통해 사용법을 알고 싶었는데 w3schools의 메뉴얼 기반으로 설명을 하는 강좌였다. 기초적인 내용들을 학습해서 좋긴 했지만 다음에 시간이 날때 실제 적용하는 부분을 추가적으로 공부 해야겠다.

  • 우아한형제들 이력서 작성을 미루다가 마지막 날인 오늘 작성을 했다. 미뤘던 이유는 두가지로

    1. 아직은 더 공부 해야 할 것 같다고 느꼈다.
    2. 지원서 작성 할 시간을 내는 것보단 공부 시간을 더 갖고 싶었다.

    두 가지다 비슷한 말이긴 하지만 결론 적으로 요즘엔 모르는, 부족한 부분들을 공부하는게 가장 즐겁다. 그럼에도 결국 작성한 이유는 너무나 매력적인 곳이라고 느꼈기 때문이다. 좀 더 준비 되었을때 모집을 했으면 좋았겠다고 생각 하지만 아쉬워 할 수만은 없다. 지원 자체를 안하면 나중에 후회를 할 것 같았다.(게다가 미련을 남겨두면 공부에 집중이 안되기 때문에 말이다.)

내일 할일

  • 알고리즘 강의 듣기

  • 코드스쿼드의 새로운 과정 참석