항해99 본과정 심화트랙 1주차, 자료구조와 알고리즘 1주차.
굉장히 꽉꽉 들어찬 일주일이라 그런지 10일 정도는 흐른 느낌이었다.
빅오와 시간복잡도, 연결리스트, 스택, 큐, 해시테이블, 그래프와 DFS. 6일 동안 1일에 1개씩 공부했다.
전부 처음 배운 것들이고, 다 어려웠지만 재미는 있었다.
문제들도 너무 어려워서 몇 시간씩 붙잡은 것들, 답을 본 것들, 풀었지만 그날 배운 것을 이용하지 않은 부분까지.
시간이 너무 짧게 느껴졌다. 잠시 개념이나 문제에 집중했다가 시계를 보면 시간 단위로 흘러, 점점 조바심이 들었다.
재미는 있었지만 구현이 좀 어렵다거나 문제에 적용하는 것 등이 따라가기 버거웠고, 기록하는 시간도 그만큼 오래 걸렸다.
그 과정에서 시도한 것과 배운 것도 분명 있었지만, 불안감을 떠안고 자신감도 많이 잃었다.
이번 주에 시도한 것과 배운 것을 나열해 보자.
우선 첫날은 문제가 너무 어려웠지만 그래도 만족스러운 하루를 보냈던 것 같다.
하지만 아무래도 시간을 많이 썼던 부분과 파이썬에 익숙하지 않은 점이 걸렸다.
식사 시간이나 자기 전에 간간히 파이썬 문법 강의를 봤다. 나름 도움이 되었던 것 같다.
지금에서도 모자람을 느끼지만 본과정 전과 지금을 비교하면 1주일 사이에 파이썬에 굉장히 친숙해진 기분이 든다.
(자바스크립트가 괜찮을까 걱정이 될 정도로)
2일차는 연결리스트, 처음 공부하기도 했지만 개념을 떠나 구현과 알아 보는 게 힘들었다. 값과 순서 등이 눈에 쉽게 보이지 않는 것 같아,
이걸 왜 이렇게 불편한데 사용하나 싶다가도, (시간복잡도나 삽입과 제외 등의 효율적인 측면은 알고 있었지만)
이후에 공부한 스택, 큐, DFS의 개념들에서 노드가 사용될 때 많이 떠올랐다.
문제를 풀 때는 아리송하게 이해한 상태였고, 연결 리스트를 사용한 답과 구현에 있어 분석하며 그래도 어느 정도 개념을 잡아 갔다.
여전히 시간이 많이 걸리는 것이 걱정이었고, 내가 연결 리스트를 구현하거나 이해하는 게 쉽지 않을 거라 생각했다.
3일차는 스택이었다. 개념은 어렵지 않았다. 하지만 구현과 문제가 좀 어렵게 느껴졌다. 어제 연결 리스트의 연장처럼 느껴지기도 했다.
문제를 풀었는데 스택을 이용했다고 하기 어려웠다. 파이썬은 리스트로 스택을 구현할 수 있다지만, 내가 푼 것은 단순히 조건문과 반복문의 활용이었던 것 같다.
특히 어려웠던 문제가 하나 있었는데, 팀 스터디와 팀원의 조언을 참고로, 표를 통해 시각화를 해보았다. 그제서야 조금이나마 이해가 되었지만,
여전히 그 풀이는 쉽게 떠올릴 수 있는 풀이가 아니라는 생각이 든다.
이때 느꼈던 점은, 시각화를 해 놓으면 헷갈리는 일이 줄어들고, 과정을 눈으로 명확히 볼 수 있어 도움이 된다는 것을 알았다.
문제가 조금 어렵거나 이해가 가지 않을 때, 시각화를 하는 습관을 들이고, 이를 통해 알고리즘 문제를 풀어 봐야 겠다는 생각을 했다.
4일차는 큐였다. 전날 공부한 스택과 비슷한 개념이었고, 사실 개념은 너무 쉬웠다. 다만 여전히 노드의 활용이 조금 어려웠다.
Deque라는 사기적인 모듈을 알게 됐다. 리스트랑 비슷해 보이는데 활용도가 더 높고 간단한데도 시간복잡도가 상수로 처리되는 게 대박이다 싶었다.
collections와 같은 모듈도 공부해 보면 좋겠다는 생각을 했다.
이때쯤 다른 사람들이 노션을 활용해, 문제 푸는 과정을 기록하여, 난관을 마주한 것과 해결 등 '과정'이 들어간 것이 좋아 보였다.
블로그 작성도 수월해질 것 같다는 생각이 들었고, 조만간 나도 저렇게 풀어 봐야 겠다고 생각했다.
5일차는 해시테이블, 해시테이블 개념 자체는 어렵지 않았다.
그날 배운 개념을 잘 활용해서 문제를 풀고 싶다는 욕심이 생겨서, 유튜브에서 해시테이블 개념 영상을 몇 개 더 보았다.
해시테이블의 개념이 안쪽에 꽤 이것저것 있고, 너무 재미 있어서 보고 정리를 조금 하다 보니, 문제를 푸는 시간이 평소보다 촉박했다.
그런데 해시테이블의 개념을 그렇게 이해해도 문제에 적용을 못하겠더라는 난관에 부딪혔다.
이게 해시테이블로 푸는 문제라고? 이때, 내가 알고리즘 문제를 푸는 것에 약한가? 하는 의문이 들었다.
평소에 이해력과 활용력, 두뇌 게임을 좋아하던 나였다 보니 더더욱 꺾였던 것 같다.
동시에 이렇게 알고리즘에 허덕이는데, 이렇게 지내도 괜찮을까? 하는 생각이 더욱 깊어졌다.
심화트랙의 주특기 기간이 2주로 짧은 것도 있고, 내가 아직 리액트를 제대로 공부해본 적이 없는데 괜찮을까.
사실은 병행해야 하는데, 이렇게 자료구조와 알고리즘 조차 시간을 모자라 하는데 어떡하지? 싶은 생각이 들었다.
6일차는 그래프와 DFS, 여기서도 노드가 나왔다. 노드를 차분히 이해할 시간이 필요하다. 어제 다 못 풀고 다 이해하지 못한 해시테이블의 문제가 걸렸다.
일단은 그래프와 DFS에 집중했다. 오전에 시험을 봐서 시간도 모자랐고, 개념도 헷갈리고 어려웠다. 시간이 적다 보니 차분히 파보지 못 한 것 같다.
그래도 우선은 개념 이해에 집중하고, 발표를 맡은 과제 두 개만 우선 어떻게 풀어 보자! 생각으로 차분히 개념을 공부했다.
첫 멘토링도 잠깐 다녀오고, 노션에 기록하면서 공부했더니 생각보다 시간이 많이 걸렸다. 예제 강의를 대충 보고, 1시간~1시간 반 정도 두 문제에 임했다.
이제 문제에 할당하는 시간을 줄여야 겠다는 생각에 잘 됐다고 생각하고 풀었다.
첫 문제가 쉬워 보여서 그걸 먼저 풀었는데, 번역이 이상해서 문제가 이해가 잘 안 됐다. 그래도 예시도 보고 어찌저찌 문제를 잡아갔다.
풀다가 헷갈려서 예제 강의를 다시 훑고, 다시 문제를 풀었는데 문제를 잘못 이해했던 것이다... 값이 하나가 다른데, 사실 다 뜯어 고쳤어야 했다.
실행해보고 예시를 보고서야 알아차렸다. 처음에 접근하던 방향이 맞았는데 중간에 샜다가 다시 왔을 때, 문제가 헷갈려서 예시를 잊어버렸다.
시간이 촉박해져서 마음이 급해서 실수를 했던 것 같다.
문제는 이거라도 발표하고 더 어려운 문제는 답을 하나 긁어 와서 이해하고 이런 답이 있었다 소개하려 했는데, 시간이 다 돼서 잘못된 것을 알았다.
그래서 두 문제 다 풀지 못한 상태가 되었다. 심지어는 얼른 검색해서 긁어 온 두 번째 문제의 답도, 이해가 잘 안 되었다는 것이다.
결국 두 문제의 발표가 최악의 상태로 발표조차 제대로 하지 못하고 끝이 났다.
열심히 공부하고 준비해서 발표한 다른 사람들에게 폐를 끼친 것 같아서 너무 자괴감이 들었다.
5일차에 흔들렸던 마음이 6일차에 부서졌다.
더 공부를 해야 하는데, 이 상황에선 자괴감 안 될 것이라는 생각에 기분전환으로 산책을 다녀왔다.
다행히도 중간에 친구들을 만나 큰 위로를 받았다. 시간을 좀 썼지만, 다시 공부를 해나갈 기력을 얻었다.
오늘도 해야 할 다른 일이 있어서 복습에 별로 시간을 쓰지 못했다. 아쉽게 생각한다.
하지만 내일은, 1주차에 배운 시각화, 개념 및 풀이의 노션 기록에 더해 악착 같이 시간 제한을 두고,
풀이를 이해하고 개념에 익숙해지는 방향에 집중해보려 한다.
시간적 여유를 최대한 만들어서, 미리 다음 날의 개념을 공부하고, 문제도 하나 정도 풀어 보고
리액트 강의도 우선 useState나 useEffect를 이용한 CRUD 구현을 향해서 짧게라도 차차 들어보려 한다.
내일 BFS의 경우, DFS처럼 탐색 구조이며, 스택과 큐 정도의 차이가 아닐까 한다.
미리 개념 강의를 조금 들어 두고, 내일 더 수월한 진행을 통해 위와 같은 결과를 내보고자 한다.
본과정의 첫 TIL, 긴 줄글로 가독성이 떨어지지만,
내가 1주일 동안 겪고 느낀 점과 다짐은 여기 담았다.
오늘이 이미 늦은 시간이다. 여유가 없으니, 이걸 꾸밀 시간에 BFS 개념 강의를 보겠다.
앞으로도 내 최대 과제는 시간의 분배와 활용이다. 잘 헤쳐 나가자.