WEEK01-04_지난 4주간의 회고
intro
정글 입성 이후 4주가 지나 첫 회고를 쓰게 되었다.
어떤 정리를 해야 되는지, 어떤 것을 쓰면 좋을지 고민만 하다가 글은 하나도 남기지 못했고,
다시 참고해야지 하면서 쌓아놨던 자료들은 파편화되어 어떤 자료였는지 확인하기 힘들어졌다.
어떤 식으로든 정리가 필요하다는 걸 실감하고 있다.
다른 분들의 개발일지를 참고하면서 앞으로 나만의 틀과 정리 방법을 익혀나가려고 한다.
ps. 작성중인 글이 날라갔다.. cycle = 2
week01
미니 프로젝트 하면서 파이썬의 문법, 기초가 전혀 없다는 것을 실감했고, 집에서 가져온 <점프 투 파이썬>부터 익혀야겠다고 계획했다. 문제가 담긴 엑셀 시트를 받고, week01 첫 번째 문제인, "hello world" 출력하기는 바로 할 수 있을 줄 알았는데... 처음부터 헤매는 걸 보면서 계획대로 해야겠다고 결심했다.
3일 차까지 파이썬 책을 읽으며 엑셀에 주어진 기본 문제를 천천히 따라갔다. 그 이후 파이썬 알고리즘 입문 책 관련 단원을 읽어나가면서 문제들을 접하기 시작했다. 다만, 1주 차 단원은 생각보다 깊었다.
- 1주 차 키워드 : 정수론, 배열, 문자열, 재귀 함수, 정렬, 완전 탐색, 시간 복잡도
- Computer System 1.1.-1.4.
기본을 익히느라 시간이 많이 걸렸고, 다른 조와의 차이가 많이 벌어진 상태.
내 최선의 방식은, '답부터 보고 생각하기'였다.
노 베이스에서 일주일 내에 해당 부분을 따라가기 위해 다른 사람의 답안을 열심히 참고했다. 문제 흐름을 이해하지 못한 상태였고, 답을 보고 문제를 분석하는 것이 주어진 시간에서 할 수 있는 최선이라고 생각했다.
결과는, 0/3
알고 있다고 생각했던 개념들을 문제에 적용시키지 못했다. 답안 코드를 이해했다고 말했던게 얼마나 건방진 생각이었던 건지. 내가 일주일 동안 했던 것들은 코드 읽기 뿐이었던 것이다. 답만 보고 기억하는 연습만 했던 것 같다.
수학 유형(1110)도 나왔는데, 컴퓨팅적 접근 방식을 사용하지 못했다. 문제만 보고 1차원적으로 수학 풀이를 해내려고 했다.
따라서,
2주차에서 책으로 개념 공부한 것을 문제에 적용하는 방식을 익히려고 계획했다. 또한 문제를 볼 때 해당 주차 알고리즘을 어떻게 적용해야 되는지 생각하려고 했다.
week02
1주 차 과정을 통해 책을 읽더라도 개념을 읽기만 했고, 이해하지는 못했던 상태라는 것을 깨달았다. 또한 문제를 보면서 개념을 떠올리려면 다양한 문제를 접해야 한다고 판단했다. 따라서, 엑셀 시트와 관련된 난이도 하-중 문제들을 더 풀어보기 시작했다.
- 2주 차 키워드 : 이분 탐색, 분할 정복, 스택, 큐, 우선순위 큐
- Computer System 1.5.-1.7.
이분 탐색, 분할 정복 문제들을 보면서, 왜 알고리즘이 분류가 될 수 있는지 조금은 알 수 있게 되었다. 답안을 보면 코드의 틀이 보였다. 어려운 문제들은 조건을 생각해내는 것들이 어려운 것이지, 답안을 확인해보면 풀이방법은 비슷했다.
1주 차 내용들이 계속 적용되었다.
재귀 부분을 잘 이해하지 못한 상황이라 공부를 하고 2주차로 넘어가려고 했는데 여기에서 계속 쓰인다. 시간복잡도 또한 계속 생각해야 됐다. 이분탐색 문제들은 특히 탐색의 범위를 줄이거나 불필요한 부분을 간단히 줄이도록 요구했다. 결국 알고리즘을 공부하는 핵심은 보다 더 효율적인 방법을 찾아내려는 것이 아닐까
코드에서 많이 쓰는 함수들을 정리해보기 시작했다.
텍스트로 봤던 함수들은 문제에서 사용해보지 않고는 제때 적용하기 어렵다는 것을 알았다. 모든 함수를 다 공부하고 사용할 수 없으니, 사용할 때마다 정리하는 중이다. 답안을 구상하면서 이런 함수가 있을까 하며 찾아보기도 하고 주변에 물어보거나 다른 사람 코드를 보면서 새로운 함수가 있으면 참고했다.
시험 결과는, 1/3
한 문제는 맞추었다는 일말의 뿌듯함도 있었지만 이것이 내 실력은 아니라는 걸 잘 안다.
맞춘 한 문제는 코드를 이해하고 작성한 것이 아니라, 비슷한 답안을 생각해내서 결과가 잘못나오면 숫자를 바꾸거나 변수를 바꿔가면서 답만 얻어낸 방식이었다.
개선할 점,
아직도 재귀에 대한 이해가 부족했다.
분할 문제도 어떻게 나눌지 정도만 고민했지, 전체를 보는 능력이 부족했다. 재귀 종료 시점을 어떻게 잡아야 하는지, 답을 구해나갈 때 결합을 어떻게 할 것인지를 생각하며 함수를 구현해야 한다.
구현 문제가 버거웠다.
어떻게 풀어야 할 지는 알겠는데 이것을 어떻게 코드로 옮길지. 특히 뱀(3190)문제에서 어려움이 있었다. 코드를 많이 작성해보지 않아 생긴 문제라고 본다. 쉬운 코드라도 직접 써보는 연습을 했고, 생각을 코드로 녹이는 과정을 세분화해서 작성해보려고 했다.
week03
3주차에는 사고과정을 코드로 녹이는 연습을 세세하게 하려고 했다.
또한 해당 주차 개념을 최대한 익히면서, 적절한 자료구조가 무엇인지 계속 고민하려고 했다.
- 3주 차 키워드 : 그래프(vertex, edge, node, arc), BFS, DFS, 위상 정렬
- Computer System 1.8.-1.10.
다른 주차보다 사전학습이 많이 필요한 주차라고 한다.
다만 나는 큰 차이 없었다. 베이스가 없다보니 지난 주차 모두 개념강의와 책부터 보고 시작했는데, 이번 주차도 같은 방식으로 학습했다.
문제 푸는 양을 늘리고, 같은 문제를 다른 방식으로 풀었다.
연결요소의 개수(11724) DFS와 union_find
바이러스(2606) DFS, BFS, union_find
최소스패닝트리(1197) 크루스칼, 프림
구슬찾기(2617) DFS(+위상정렬), 플로이드와샬
섬의개수(4963) DFS, BFS
트리의부모찾기(11725) DFS, BFS
이전까지의 "맞았습니다!!" 는,
답안 코드를 똑같이 작성할 수 있다 혹은 기억하고 있는 알고리즘 틀에 적당히 변수를 맞춰 답이 나왔다 정도였다. 코드 하나하나를 왜 이 시점에서 썼는지 이해는 못했었다.
답안을 이해하는 것과 코드를 작성하는 그 사고 과정을 체득하는 것은 다르다.
그래프 문제들이 정형화된 틀이 있다보니 비슷한데 살짝만 다른 답안 코드들이 있었다. 코드 한 줄의 위치 차이로 다른 답안이 나오기에, 비슷한 문제를 두고 비교를 해보기도 했다. for문이 어느 시점에 들어가는지, 초기화해야 되는 변수를 어디에 넣어줬는지 보면서 코드의 맥락을 이해해보려고 했다.
같은 문제라도 푸는 방식은 매우 다양했다.
되새길 것이, 알고리즘 학습의 목표인데
아마도 어떤 문제 상황이 주어졌을 때, 적합한, 더 효율적인 방식이 무엇일까 사고하는 것, 접근해보는 것이라고 생각한다. 이번 주차는 내가 생각하는 이 목적에 맞게 다양한 풀이와 접근법을 사용해보려고 했던 것 같다.
시험 결과는, 2/3
결과는 보다 좋아졌지만 지난 주와 비슷한 느낌이었다. 틀을 반짝 잘 외웠구나.
다만 이상한 답이 나왔을 때 변수 때려넣기로 문제를 풀지 않았다는 점, 어디에서 잘못되었는지 코드를 보며 고민을 했다는 점에서 조금은 발전했구나 싶었다.
week04
- 4주 차 키워드 : 동적 프로그래밍, 그리디 알고리즘
- Computer System 3장. 프로그램의 기계 수준 표현
금요일, DP와 그리디 이론 공부를 하고 난이도 하-중 개념문제를 간단히 보고
그 후 일요일까지 CS책을 혼자 읽기 시작했다.
CS책을 읽어나가기가 버거웠다.
1장과 비슷한 수준이겠거니 3장을 봤는데, 적당히 훑으면서 읽었더니 연습문제에는 손도 못대고, 앞 내용과 연관있는 부분은 한문장도 읽어나가기 어려웠다.
읽힐 때까지 처음부터 다시 읽었다.
그럼에도 해결되지 않는 질문거리가 쌓이기 시작했다.
일요일쯤 되자 CS책을 읽는 사람이 한두 명씩 생겼고, 자연스럽게 질답을 주고받고 같이 책을 읽었다.
이후 스터디를 제대로 시작했는데,
생각보다 나도 답변할 수 있는 부분이 있었고, (덕분에 백과사전이라는 별명을 얻었다)
발제에서 나왔던 질문에 대해 얘기도 나눌 수 있었다. 혼자 책을 읽을 때는 흐름을 파악하지 못해 답을 못내렸던 부분이었는데 다행이었다.
결론적으로 4주차 발제가 중요했다.
- 데이터가 기계 수준(메모리)에서 어떻게 표현되는가?
- 기계 수준에서 유지되는 데이터 수준은 무엇인가? (2개) 그리고 어떻게 사용되는가?
- 그리디와 동적프로그래밍을 같이 학습하는 이유는 무엇일까?
DP의 틀을 만들기 시작했다.
내가 어떤 생각을 하는지, 어디에서 함수를 써야 되는지 조금은 생각하게 되었다.
시험 결과는 2/3,
문제를 보면서 '생각'이라는 걸 드디어 해냈구나 싶었다. 문제를 정말 풀어냈다. 익혔던 알고리즘을 쓰면서 새로운 문제를 볼 때 어떤 부분을 바꿔야 될지 파악하려고 했고, 3번째 문제의 출력값을 어떻게 낼 수 있을지 접근 방법에 대해서도 고민했다.
앞으로 알고리즘은 어떻게 공부할 것인가?
1. 현재까지 접했던 유형들을 복습할 것
지금까지 접했던 유형들이 매우 큰 범위이면서도 빠르게 훑느라 간단히만 알고 넘어갔던 것 같다. 4주간의 과정을 다시 4주간 한번 더 반복하는 것을 목표로 하고 있다.
2. 사고의 과정, 틀을 만든다
4주 차에 와서 코드를 생각하고 칠 수 있는 능력이 조금 생겼다. 그 틀을 만들고, 내 사고 과정에 따라 구현하는 방법을 고민해보려고 한다. 스터디를 통해 알고리즘을 어떻게 보완할지, 더 좋은 방법은 무엇이 있는지 여러 스타일을 적용해볼 것이며, 꾸준히 코드리뷰를 주고받을 생각이다.
3. 구현력을 기른다.
쉬운 문제부터 내 사고에 맞춰 코드를 작성하는 연습을 하려고 한다.
4. 고민의 시간을 갖는다.
시간 제한을 두고 고민하라는 팁은 1주차의 나에겐 의미가 없었다. 솔직히 시간을 아무리 많이 두더라도 풀지 못했을 것. 아무것도 모를 땐 답 보고 공부하는 게 가장 효율적이라고 본다. 시험을 위한 공부 혹은 답이 정해진 공부는 이렇게 해야 한다.
그러나 앞으로의 코딩은 그렇지 않다. 정해진 시간에 문제 흐름을 파악하고 어떤 알고리즘이 필요할지 사고할 필요가 있다.
어떤 것을 기록할 것인가?
평소에 시간 단위보다는 해야 될 양으로, 그리고 일주일 단위로 스케줄을 정리하는 편이었다. 정글 학습 내용이 1주일 단위로 되어 있어서, 공부할 부분은 이 과정에 따라 설정하면 될 것 같다. 지난 기간 동안은 어느 정도의 양을 해야 될지 감이 잡히지 않아 헤맸는데, 알고리즘 스터디를 하면서는 정리하기가 수월해질 것 같다.
- 알고리즘 풀이 기록
- CS 학습 내용 기록
- 공부한 것 30분 단위로 적어놓기(구글 캘린더 이용)
- 주 1회 글 정리하기(개발일지 작성)
생활 루틴
강의실 아침 멤버로 각인되고 나서 내 생활 루틴을 물어보는 분들이 많아졌다.
힘들지 않은지, 스트레스받지는 않는지에 대한 물음에 대답하자면,
전혀. 오히려 즐기고 있다.
스트레스 없이 생활하고 있는 지금 하루하루가 아까울 정도다.
고교 3년간의 기숙사 생활과 2년+2년의 고시 생활 동안 익히려고 했던 습관들이
정글과 매우 잘 맞아떨어진 것 같다.
구체적인 계획을 했던 건 아니지만 지키려고 하는 몇 가지는 있는데
- 기숙사 입퇴실은 빠르게, 일어나자마자 강의실로
- 기상시간 유지
- 운동은 최대 하루 한 번만, 웬만하면 계단 오르기
- 루틴을 위한 루틴으로 스트레스받지 않기
강의실에 먼저 와 혼자 있는, 이상하고 고요한 분위기를 좋아했는데
아침 분위기가 좋다고 얘기를 하고 다녔더니 경쟁자(?)들이 늘었다.
심지어 나를 기준으로 삼는 사람들도 생겼다
열심히 하려는 사람들이 많아졌으니 어쨌든 좋은 현상이다.
+ 시간대별로 생활을 계획하지 않는 이유는, 스트레스를 받아서 이다.
대략적인 시간은 정해놓더라도 유동적으로 관리하는 게 나에게 맞는다.
예를 들어, 일어나는 시간의 최소한과 최대한을 정해놓되, 최대한 또한 무리하지 않는 범위에서 정하는 것
기상 시간으로 스트레스 받지 맙시당 !
5주차를 들어가며
새로운 학습 내용이 주어졌다.
빠르게 CS 3장 흐름을 읽고 지나가고, CS 9.9. 동적 메모리할당 부분부터 읽어나갈 계획
C언어 중 포인터와 구조체 개념을 학습하고,
Red/Black Tree 이론 공부 후 구현 연습을 하려고 한다.