2023/04/07

이번 주 부터는 프로젝트를 하진 않고, 백준 코딩 문제를 풀고 알고리즘을 공부한다. 기초 문제 대부분은 풀고 오늘 하루를 마쳤지만, 그 이후에 생각을 깊게해야 하거나 내가 아직 잘 모르는 알고리즘이 있어 잘 풀리지 않는 문제들이 꽤 있다. 난이도가 “하”인 문제들 중에서도 막히는게 있는데, 아직까지는 “중” 난이도 문제는 풀리지 않는다. 앞으로가 점점 걱정되기 시작한다.

2023/04/08

배낭에 들어있던 텀블러가 잘 잠기지 않아 책과 종이가 물에 젖은채로 하루를 시작해 기분이 되게 불쾌했었다. 하지만 빨리 잊어버리고 어제 풀다가 못한 달팽이 문제를 풀었다. 그러다가 이미 모든 문제를 푼 사람이 돌아다니면서 도움을 줬는데, 내게도 이 달팽이 문제에 대한 힌트를 줬다. 나도 거의 풀리는 듯 했는데, 이게 오답이라고 나와 결국 인터넷에서 솔루션을 찾았다. 소수 반올림하는 math 모듈의 ceil함수가 있다고 하여 이걸 사용했더니 해결되었다. 이렇게 내가 모르는 함수나 알고리즘이 계속 내 발목을 잡고있다.

2023/04/10

솔직히 말하자면, 0주차 프로젝트를 마치고나니 본격적으로 알고리즘 공부를 시작했는데, 진도가 잘 나가지 않는다. 하지만 내일이 퀵 정렬의 작동 원리에 관한 퀴즈가 있어, 알고리즘 익히는데에 집중했다. 우선은 “Do it!” 교제에 있는 예제 코드를 디버깅하면서 과정을 따라가면서 화이트보드에 적어가면서 변수의 변화를 확인하고 익혔다.

우선 방식은 이렇다. 리스트가 주어지면 첫 번째와 마지막 인덱스가 좌측 인덱스와 우측 인덱스가 되고, 이 둘 사이의 값이 중점 값이 된다. 우측값이 중점의 값보다 크면, 우측 인덱스를 하나 낮추고, 좌측값이 증점의 값보다 작으면, 좌측 인덱스를 하나 높인다. 인덱스를 계속 변경해야 하면 조건을 더이상 만족시키지 못할 때까지 반복하면 된다. 이 상태에서 우측 인덱스가 여전히 좌측 인덱스보다 크면 이 두 값의 위치를 서로 바꾸고, 좌측 인덱스 값을 하나 증가시키고, 우측 인덱스 값을 하나 감소시킨다. 그러다가 결국 우측 인덱스 값이 좌측 인덱스 값보다 작아지는 상황이 일어날 것이다. 그러면 기존에 저장된 좌측 인덱스 값(배열의 첫 번째 인덱스, 0)이 현재 우측 인덱스 값보다 작으면 이 두 값을 새로운 좌측과 우측 인덱스 값으로 취급하여 함수를 재귀한다.

2023/04/11

어제까지는 퀵 정렬에서 중점(pivot)의 좌측 인덱스인 pl값이 right값보다 작은 조건을 만족시키지 못할 때 갑자기 몇몇 변수 값들이 변동되는 이유를 이해하지 못했는데, ChatGPT에 계속 물어보고, 다시한번 코드를 디버깅하면서 분석해보면서 그 원인을 알 수 있었다. 재귀 함수를 이용하기 때문이었다. 그냥 재귀함수의 특성상 여러 조건을 지나치면서 앞서 시행되지 못한 함수 결과가 나중에 구현되는 것이다. 하노이의 탑 문제에서도 마찬가지다. 이게 재귀 함수의 특징이라는 것을 이제야 깨달았다. 오늘은 퀴즈가 하나 있었는데, 퀵 정렬의 진행 과정을 파악해서 임의의 리스트(list)가 주어졌을 때 교제의 그림 처럼 나타내야 했었다. 그림과는 다른 방식으로 했지만, 어쨌든 과정을 잘 따라갔음을 확인했다. 그 이후에는 나머지 백준 코딩 문제 푸는데에 집중하기로 했다.

사실 요즘따라 나른하다. 저녁을 먹었는데도 힘이 나질 않고 나른하다. 일주일 이상 10시간 넘게 앉아서 공부만 하다보니 점점 지치는 듯 하다. 운동 좀 해야겠다.

2023/04/12

내일이 시험날이다. 하지만 성적을 메기는것은 아니라 크게 긴장되진 않는다. 다만 앞서 이론 학습보다 코딩 문제 푸는데에 시간을 더 썼다는 것에 자괴감이 들었다. 하지만 지금 생각해보니 앞서 이론 공부에 더 몰두했다면 지금와서 코딩에 시간 좀 더 쓸걸 하는 생각이 들었을지도 모른다. ^^;

그래도 입력 정렬, 병합 정렬, 그리고 힙 정렬의 정의랑 작동 원리를 익히는데에 집중했다. 하지만 힙 정렬이 매우 어렵다. 익숙하지 않은 트리(tree) 구조를 이용하는거라 그렇다고 생각한다. 다른 것은 코드를 디버깅하면서 변수의 변화를 트랙킹하면서 이해를 했지만, 힙 정렬은 그냥도 이해가 잘 안되니 디버깅을 하면서도 왜 이렇게 바뀌는지 이해하는데 어려움을 느꼈다.

그리고 풀이를 보고 풀었던 문제들 중에 아직 과정을 익히지 못했던 문제들의 개념을 내걸로 만드는데 시간을 들이려 했지만, 알고리즘 공부만으로 시간이 많이 지나갔다.