갑자기 생긴 휴일 기념으로 이전에 듣다가 묵혀놨었던 '홍정모 연구소의 자료구조 압축코스' 강의를 완강하였다. 학교에서 자료구조 공부도 해보고 코테를 위해 문제를 어느정도 풀어봤던 사람으로써, 이번 강의를 듣는 목표는 스스로 생각하는 힘을 기르기, 그를 위해 힌트를 듣지 않고 바로 강의의 문제 풀어보기이다.
일반적으로 홍정모 교수님의 강의 순서는 다음과 같이 진행된다.
나는 여기서 1번에 해당하는 내용만 듣고 바로 코드 실습을 진행하는걸 목표로 하였다. 내 기억상 대부분의 챕터에서 이를 성공할 수 있었다. 내가 강의를 들으며 기억하고 싶던 부분들을 정리할 겸, 좋은 강의를 홍보하기 위해 글을 작성하였다.
(강의의 상세한 커리큘럼이 궁금하신 분은 글 하단의 강의링크에서 확인해주세요!)
c++에서 포인터, 레퍼런스를 사용하는 기본적인 구현에 대한 설명과 o^n 시간복잡도의 정렬 친구들의 성능 측정, 복잡도에 대한 학습을 하는 챕터이다. 머리를 말랑말랑하게 만들기 좋은 챕터였던 것 같다.
이 강의의 장점중 하나가 강의에서 사용한 추가 자료를 정말 잘 정리해주셨다는 점이다. 아래 스크린샷은 강의에 첨부되어 있는 탐색 알고리듬의 성능을 비교한 표이다. 이런식으로 비쥬얼적으로 볼 수 있는걸 자료를 특히 잘 만들어주시지 않나 싶다. 그 외에도 보충적으로 학습할 수 있는 자료들을 정리해서 강의에 올려주시는 편이라, 원한다면 시간을 투자하여 더 깊은 공부를 진행할 수도 있다.
옛날 스택과 재귀를 공부한지 얼마 안되었을 때 하노이 탑 문제에게 좌절하고 무릎을 꿇었던 기억이 있다. 하지만 이번에는 프로그래밍을 해오며 쌓인 짬과, 강의를 들으며 생각하는 힘을 기른 탓인가 이번에는 금방 문제를 해결할 수 있었다.
이전까지의 문제와 달랐던 점은 이번 챕터부터 '디버깅'을 이용했다는 것. 이전까지는 그냥 생각 한번하고 코드를 구현하면 거의 정답이였지만, 하노이의 탑 문제는 그렇게 풀 수 있는 쉬운 문제는 아니였다. 교수님도 디버깅의 중요성을 강조하시고, 강의를 듣는 학습자가 디버깅에 익숙해질 수 있도록 도와주시는 편이라 실습을 진행하며 디버깅에 익숙해질 수 있어서 좋은 것 같다.
이번에도 아래 스크린샷과 같은 비쥬얼적으로 하노이탑을 볼 수 있는 자료와 하노이 알고리듬에 대한 참고 자료를 올려주셨다!
요번 강의에서 제일 막혔던 부분이다. 나는 트리에 약한편이구나..
흔하게 사용하는 재귀를 사용하는 이진 트리의 구현은 정말 막힘없이 슈슈슉 진행했었다. 하지만 이번 실습에서는 재귀를 사용하지 않는 이진 트리의 구현도 섞여있었다는 것이다. Preorder, Inorder, Postorder 등 정말 아무렇지 않게 구현하던 트리 순회를 재귀를 사용하지 않고 구현하려니까 뇌가 저리는 느낌이 들었던 것 같다. 한번에 다 풀지 못해서 머리를 식힐 겸 샤워를 갔다오고 다시 문제를 풀기도 하였다.
그래도 끝까지 힌트를 보고 풀지 않겠다는 다짐을 지키고 머리를 혹사시킨 결과, 결국 구현을 성공하였고 트리에 대해 더 깊게 이해할 수 있게 되었던 것 같다. 여기서 얻은 경험은 이후 더 어려운 알고리듬을 학습하는데 큰 도움이 될 것 같다.
Rotate개념이 재미있었던 파트. 처음에 가시화 도구에서 노드들이 빙빙 돌아가는거 보고 저게 뭐지 하면서 뇌정지가 왔었는데, 노드들이 움직이는걸 자세히 보며 코드를 만져보니까 한순간에 이해가 되서 구현할 수 있었다. 자료구조나 알고리듬을 공부하면서 가장 재밌는 순간이 이럴 때가 아닐까.
위 스크린샷은 실습 중에 캡쳐한 것인데, 트리를 생성되는 과정을 확인할 수 있도록 각 실습에 디버깅 코드를 준비해 주셨다. 현재 디스코드에서 제작중이신 알고리듬 강의에 사용될 'A* 쿼드트리'도 비쥬얼 디버깅을 할 수 있게 작업중이신 영상을 올려주셨는데 대박이라고 생각이 들었고 이렇게까지 필요한 학습에만 집중할 수 있게 떠먹여주는 강의가 또 있나 싶다..
모범 답안이나 해설이 없는 미니 프로젝트 만들기 형태의 챕터. 위에서 실습했던 AVL트리가 범용성이 좋아서 걱정했던 것 보다 정말 금방 구현했던 것 같다.
DFS BFS와 같은 탐색 알고리듬은 내가 가장 자신있는 유형이였는데.. 내가 모르던게 있었다. 그것은 바로 스택만 사용해서 탐색을 진행한다고 DFS알고리듬이 아니였다는 사실.. 아래 강의에 첨부된 자료를 보자면 스택기반 탐색과 DFS탐색의 결과 차이를 알 수 있다. 이러한 디테일 차이로 문제를 틀릴 수도 있겠다고 생각하니까 섬뜩했다.
https://11011110.github.io/blog/2013/12/17/stack-based-graph-traversal.html
그냥 앉아서 멍하니 영상만 보며 듣기만 하는 강의가 아니라, 학습자에게 지속적으로 스스로 생각하도록 유도해주는 강의이다. 스스로 생각하고 문제를 풀며 기본기를 탄탄하게 길러보고 싶은 사람들에게 이 강의를 추천한다. 이 이후에 알고리듬 파트1,2 강의도 진행되고 있는데, 커리큘럼이 탄탄한거 같아서 만족하며 학습중이다.
알고리듬 파트1
위에서 올린 영어 사전 실습을 디스코드 게시판에 올려놨더니 새로운 생각할 거리를 주셨다.
강의주소:
https://honglab.co.kr/courses/data-structures
강의자료:
https://github.com/HongLabInc/HongLabDataStructures