sw사관학교정글

[week05] C언어 시작하자마자 red-black tree 구현하기

D cron 2021. 12. 10. 00:12

📷 회고

이번 주는 조금(많이) 버거웠던 주였다. 앞으로 9주 동안 C언어를 사용하기 때문에 첫 주차에 C언어의 기본적인 내용들을 정리하고 가고 싶었다. 그래서 목, 금, 토, 일요일을 모두 사용해서 C언어를 한번 훑었다. 파이썬과 비슷한 부분은 넘어가면서 최대한 빨리 본 것인데도 4일이나 걸려서 당황스러웠다. 3일 정도 걸릴 것이라고 생각했는데 생각보다 양이 많았다...

 

C언어 개념과 문법을 훑은 다음에는 linked list를 직접 구현해 보면서 포인터에 익숙해졌다. 그리고 이진탐색 트리를 linked list를 사용해서 구현한 것을 직접 구현해보고 싶었지만 시간이 너무 부족해서 이해만 하고 바로 red-black tree 공부로 넘어갔다. 

red-black tree

그런데 red-black tree가 생각보다 너무 어려웠다 회전과 삽입, 삽입 fixup 까지 이해하는데 한세월이 걸려서 이거 이번 주 안에 못 끝낼 것 같다는 생각이 들었다. 그러나 구세주 같은 형 한 명이 나타나서 지금까지 이해 안 된 사람들을 모두 휴게실로 불러서 red-black tree 강의를 3시간 동안 진행했다. 그걸 듣고 나서 CLRS 책에 있는 의사 코드를 보니까 이해가 가기 시작했다. 원래 12시 땡 하면 기숙사로 가서 잠을 많이 자는 편인데 이번 주는 평균 3시에 들어갔던 것 같다...

 

강의를 듣지 않았으면 삭제를 구현하지 못했을 것이다. 강의를 너무 잘해서 정말 놀랐다😮 분명 red-black tree를 이번 주에 처음 봤을 텐데 지식을 습득하는 속도도 빠르고 그걸 이해하기 쉽게 설명하는 능력도 갖추고 있어서 배울점이 정말 많았다. 결국 test를 보기 전날 새벽3시에 testcase를 모두 통과하고 red-black tree 주차가 끝나게 되었다(어떻게든 하긴 했다). 어떻게 된 게 시간이 지날수록 점점 시간이 빨리 가는 것 같다

 

이번 주부터 알고리즘 스터디를 시작했다. 우리는 4명이서 진행하고 [파이썬 알고리즘 인터뷰] 책에 있는 문제 순서대로 1문제씩 풀기로 했다. 스터디를 2일 정도 해보니까 너무 쉬운 난이도는 같이 코드 리뷰를 하는 것이 의미가 없다는 판단을 내리고 난이도가 별 2개 이상인 것들만 푸는 방식으로 변경하였다. 우리는 매일 아침 10시에 1시간씩 스터디를 진행하는데 해당 주차에 진행하는 메인 과제에 부담되지 않을 정도로 진행하는 것을 목표로 하고 있다. 아직까지는 꽤 좋은 방법인 것 같다.

 

다음 주는 malloc을 구현한다는데 어떻게 구현한다는 의미인지 아직은 잘 모르겠다... 다음 주도 파이팅해보자!

💻 코치님 FAQ

Q . 왜 C 언어로 교육과정을 진행하나요?
C 언어가 인간이 이해할 수 있으면서도 기계에 가장 가깝고, 그래서 성능 타협을 별로 안 한, 즉 컴퓨터의 성능을 최대한 끌어낼 수 있는 언어이기 때문입니다.
C 언어를 제대로 쓰려면 CPU, memory, I/O로 구성된 컴퓨터 구조, 즉 폰 노이만 구조를 이해해야 합니다. C 언어로 복잡한 data structure를 구현해 봄으로써 컴퓨터의 동작 구조를 익히고 나아가서 보다 뛰어난 성능의 코드를 만들 수 있는 가능성을 엿볼 수 있는 경험을 제공하기 위함입니다.

🚀 운영진 면담

Q . 지금 C언어로 rbtree, malloc을 구현해 보는 것이 실제 현업에서는 어떻게 사용되는지 궁금합니다. 구체적으로 프런트엔드에서도 이런 깊은 지식들이 사용되나요?
사실 프론드 엔드에서는 C언어를 사용할 일이 없다.
그러나 C언어가 기본이 되어서 JS를 더 잘 이해할 수 있다.
C언어의 지식이 중요하다기보다는 생각하는 방법이 달라지고, 다른 언어를 배울 때의 속도가 빨라지는 것의 효과가 있다. C언어를 배웠으면 머릿속에 구조가 바뀐다.

이런 기회가 인생에 다시는 없을지도 모른다. 지금 시간을 들여서 밑바닥까지 파놓으면 이것이 직접 활용되지 않더라도 체화가 되고 실력이 늘게 된다. 
Q . CS지식이 현업에서 얼마나 중요한가요?
어떤 새로운 프로젝트를 한다고 하자. 이건 새로운 언어고, 새로운 프레임워크라서 전문가가 존재하지 않는다. 그럼 이 일을 누구한테 맡길 것인가? 엔지니어링을 많이 해본 사람에게 맡긴다. 그런데 CS지식이 없는 사람에게 critical 한 프로젝트를 맡길 수 있을까? 맡길 수 없다.

그러니까 결국 CS지식이 있는 건 기본이 되고 그 기본을 바탕으로 critical 한 엔지니어링 경험을 쌓을 수 있는 프로젝트들을 받게 되고, 그걸 해결하는 과정에서 성장하고 더 어렵고 중요한 일들을 맡아갈 수 있다. 기본기는 밑바탕이다.

Q . 이번 주차에 시간이 정말 없었는데 더 궁금한 부분들을 모르는 채로 넘어가야만 했습니다. 어떻게 하면 지식도 쌓으면서 주어진 과제들도 다 할 수 있을까요?
사실 많은 양이 맞다.
rbtree는 6~7주 차를 해도 다 소화하지 못하는 양이다. 1주로 끝내는 건 말이 안 된다. 여러분이 이게 얼마나 많은 양인지 모르니까 우리가 이렇게 몰아붙일 수 있는 거다. 이게 가능한 이유는 기숙사 생활을 하고, 옆에 동료가 있기 때문일 것이다.
꾸역꾸역 따라가는 것도 의미가 있다. 지금 많이 파보면 나중에 다시 볼 때 도움이 많이 될 것이다.

사람마다 출발점이 다 다르다. 지식의 양보다 지식의 습득 속도를 높이는 걸 목표로 삼았으면 좋겠고, 그걸 위해서 많이 도와줄 것이다.

마지막은 체력전이니까 건강관리를 지금부터 하는 걸 추천한다.