20230504 이번 주 부터는 C언어를 다루기 시작할 것이다. 평소에 Visual studio나 Dev C++만 썼지만, Linux 환경에서 코드를 짜본건 사실상 처음이라 어떻게 해야할지 모르겠다. 대학원 연구실 서버를 사용할 때 필요한 리눅스 코드를 몇개 입력해서 작업한것 빼고는 별로 없어 모른다고 보면된다. 코치님들은 그냥 해보면 저절로 익숙해질 것이라 하셨다. C언어로 RB 트리를 만드는게 이번주 과제라 오늘은 RB 트리의 특징을 공부하기로 했다. 알고리즘을 복습하거나 코딩을 따로 하지는 않았다.

20230505 어제까지 RB 트리의 5가지 속성과 노드 삽입 과정을 공부한 것을 바탕으로 조원들끼리 서로 정보를 공유하고, 같이 예제 문제를 보고 RB 트리가 작동하는 과정을 직접 익혀봤다. 저녁 시간 이후에는 삭제 과정을 공부했다. 나는 Notion에 코치님들이 올려주신 동영상 강의를 위주로 공부했고, 다른 분들은 유튜브에 올려져있던 다른 동영상을 위주로 공부했다.

20230508 어제까지 충분히 쉬었고, 내일부터 수요일까지 RB tree 코드 짜기로 했으니 여태 준비한것 중 부족한 부분을 보충하기로 했다. 우선 메모리 동적 할당(malloc, calloc, realloc) 함수를 익히기로 했고, RB Tree 삭제 기능이 추가보다 복잡하다보니 아직 이해가 되지 않아, 스스로 연습하고, 그 다음에 예제 코드에서 기능들을 어떻게 구현하는지 차근차근 읽어보기로 했다. 우선 malloc에 대해 얘기하자면, 메모리 저장 공간을 효율적으로 할당하기 위해 쓰이는 것이다. 배열을 쓸 경우 크기를 먼저 정해햐 하기 때문에 혹시나 빈 공간이 생기면 코드가 비효율적이게 된다. 반면, malloc은 배열과 마찬가지로 초기에 크기를 정해줘야하지만, 런타임 때 동적으로 메모리를 할당하기 때문에 충분히 사용하고 free() 함수를 통해 할당받은 공간을 반납하기에 낭비되는 공간을 없엘 수 있다. 여기에 메모리 블록의 크기를 바꾸려면 realloc을 선언하면 된다. 그리고 calloc이란 것이 있다. malloc과 똑같이 동적으로 메모리를 할당하지만, 원소들을 0으로 초기화 하고 시작한다는 차이점이 있다. RB tree에서의 삭제에 대한 설명은 동영상과 글 마다 다르게 설명해서 서로의 연관성을 잇기가 쉽지 않다. 그래서 Introduction to Algorithms 교제에 있는 pseudo code를 이해하는데에 집중했고, 인터넷으로도 이와 유사하게 짠 코드를 찾아 이에 맞춰 최종 코드를 준비하기로 했다. 그리고 다같이 예제를 보고 과정을 잘 따라가면서 공부하다 보니 머리에 잘 들어왔다. 팀워크의 힘을 다시 한번 크게 느꼈다고 생각한다.

20230509 오늘 오전은 RB tree 코드에 쓰인 함수 및 개념들을 익히는 시간을 가졌고, 점심 먹고 나서는 본격적으로 트리 생성 및 삭제, 그리고 노드 삽입 기능을 준비했다. 사실 예제 코드를 따라서 쳤다. 몇몇 변수명만 바꿔서 했다. 아무리 생각해도 복잡한 구조다보니 흐름을 이해해도 안 볼 수가 없다. 그리고 알고보니 red-black 트리라는 것이 어떤 블로그에 따르면 6~7주를 투자해도 어려운 내용이라 1주일만에 완벽하게 이해하는 것은 힘들다고 한다. 다만 같이 일하면서 서로를 지지해주는 동료가 있으니 버티는 힘이 생기는 듯 하고, C언어에 익숙해지는 것이 중점이기 때문에 알고리즘을 넘어서 한 번 복잡한 구조를 통해 빠르게 가까워지라느 취지로 보인다. 다른 사람들 말을 들어봐도 정말 힘들다고 한다. 다들 우리처럼 참고하면서 했을 것이다. 비록 예제와 pseudo code를 보면서 했지만, 같이 의논하고 고민하면서 작성했으니 어려운 개념에 더 쉽게 다가갈 수 있던 계기였다고 생각한다. 내일부터는 노드 삭제 기능을 구현한 다음에 최종 코드를 완성하고자 한다.

20230510 오전부터 삭제 기능과 탐색 기능(최대 값, 최소 값, 특정 값 찾기), 그리고 배열 변경 기능 구현을 마무리 작업에 들어갔다. 예제 코드를 보면서 해서 생각보다 빨리 진행되기는 했지만, 일부러 교제를 보면서 주석을 달면서 RB 트리의 흐름을 익혔다. 최종적으로 조원들과 의논을 했고, 깃헙에 파일을 올렸다. 그리고 테스트를 돌려봤는데, 내가 억지로 함수명을 바꾼 것들이 있는 바람에 충돌이 일어났다. 그래서 할 수 없이 본래 적혀있던 것으로 돌릴 수 밖에 없었다. 앞으로는 뭔가를 바꾸려 해도 잘 보고 해야겠다.