https://blog.naver.com/boysoeng/222716415555
올해 하이아크에 가입하고 운좋게 이런저런 관련 이벤트에 당첨이 많이 되는 것 같은데 이 책은 서평이벤트에 당첨되어 받은 책! 이 글 또한 우수서평에 선정되어 '실용주의 프로그래머'에 당첨되었는데 아직 읽어보지는 못했다.. 곧 방학이니까 이것저것 읽어봐야징
관련 서평글은 다음과 같다.
대학교 3학년 1학기, 재수까지해서 컴퓨터 공학과라는 목표 하나만을 바라보고 입학을 했지만 고등학교 야자시간 책상에서 최고의 개발자가 되겠다던 꿈을 꾸던 나는 사라지고 현실은 노는게 좋고 과제하기에도 바쁜 대학생.
교수님의 수업과 과제는 이해가 되지 않고 어찌어찌 제출은 급하게 하지만 내가 과연 이해하는게 맞나..? 3학년이면 이젠 스펙도 쌓아할 것 같고 코딩 실력도 꽤 될 줄 알았는데 나는 자료구조와 c++정도만 할 줄 아는 왕감자.
급급하게 백준에서 문제를 풀어보고 알고리즘 강의도 들어보지만 뭔가 부족하다고 느끼던 어느 날, 운 좋게 응모했던 책에 당첨이 되며 나의 시야는 조금 더 넓어졌다. 자료구조와 C++정도만 알고 과제만 꾸역꾸역 제출하는 컴퓨터 공학과 3학년(=왕감자)의 시선으로 이 책을 한 번 소개해보려고 한다.
책의 제목과 어울리게 이 책은 시작부터 몇 가지 프로그래밍 대회에 대한 안내부터 시작한다. IOI(국제 정보 올림피아드)나 ICPC(국제 대학생 프로그래밍 경시대회) 같은 규모가 큰, 다소 부담스럽게 느낄 수 있는 대회 외에도 온라인으로 매주 참여할 수 있는 코드포스, 그리고 앳코더 ,코드셰프등을 소개해준다.
본인이 나와 같은 왕감자인데 알고리즘을 깊이 탐구하고 싶다면 더더욱 이 책의 2장 - 5장은 필히 익히고 책의 이후 페이지를 읽어야 한다고 생각한다.
2장에선 프로그래밍을 하기 위한 기초에 대한 설명을 한다. 입력과 출력, 숫자처리, 비트연산에 대한 이야기를 하는데 당연히 c나 c++을 처음 배울때 알려주던 내용을 넘어 조금 더 디테일을 다뤄준다.
예를 들면 필자는 cout<<endl; 과 cout << "\n"의 차이를 알지 못하고 따옴표(")를 치기 귀찮다는 이유에서 지금까지 endl을 사용해왔는데 endl이 명시적 출력 버퍼를 비우는 과정이 일어나기에 "\n"보다 느리다는 점, 정수형 자료형은 int 만 사용해왔으나 실제는 long long을 자주 사용하고 이를 typedef ll로 사용해 빠르게 이용하는 등의 디테일을 기술해준다.
3장에서 다루는 시간복잡도에 대한 설명도 중요한데, 실제로 나는 작년 자료구조 수업때 시간복잡도 , big O, 오메가, 쎄타에 대한 공부를 할때, '코드만 잘 짜면 되지 요즘은 메모리도 늘고 cpu의 계산속도도 빨라져서 이젠 이런 개념은 크게 필요없지 않을까?'라고 생각하고 대충 넘어갔었다. 그러나, 알고리즘을 조금이라도 더 효율적으로 짠다는 개념은 더더욱 무시할 수 없다. 단순히 우리가 흔히 아는 '피보나치 수'를 재귀적 구현을 할 때에만 해도 n번째 피보나치 수에 대하여 n이 커질수록 계산을 해야하는 횟수와 시간이 늘어나게 되는데, 30번째 피보나치 숫자만 프로그램으로 계산해보려고 해도 이 과정에서 시간복잡도가 얼마나 중요한 개념인지 알 수 있을 것이다. 6장에서 다루는 동적계획법(dynamic programming)과 같은 챕터 역시 이 시간복잡도의 개념이 중요하게 작용한다.
이어서 등장 하는 챕터인 4장에서의 정렬과 탐색 5장의 자료구조는 미적분을 하기 위한 덧셈과 곱셈, 결합법칙 ,분배법칙 같은 내용이라고 생각하고 필히 익혀두길 바란다.
이후의 챕터들에서는 그래프 , 트리, 기하, 수학에 관련된 다양한 알고리즘을 소개한다. 이 이후부터는 모든 알고리즘을 다 공부하는게 가장 좋긴하겠지만, 본인이 관심있는 챕터부터 찾아서 익혀도 좋을 것이라고 생각한다. 책은 내가 보던 영어를 겨우 번역만 딱딱하게 해 놓은 전공책보다 친절하게 문장을 끊어가며 그림과 같이 설명을 해주어 가독성이 상당히 좋은 편인 것 같다. (실제로 전공 공부할때도 전공책보다 많이 참고한듯 ㅋㅋ)
나는 현재 동네의 한 학원에서 수학조교로 알바를 하고 있어 수학에 관심이 많은편이라 11장 수학 챕터를 관심 있게 읽었다. 우리가 수학공부를 어느정도 했다면 n이하의 소수의 개수, 두 숫자의 최대 공약수, 최소 공배수등은 금방 알 수 있을 것이다. 하지만, 숫자가 커진다면..? 87498과 1234의 최대공약수 최소공배수를 구하는 것과 같이 숫자가 커진다면 우리는 이를 계산할 계산기(알고리즘)을 만들어 놓고 컴퓨터를 이용해 계산하는 것이 훨씬 편할 것이다. 이를 위한 유클리드 알고리즘, 에라토스테네스의 체와 같은 알고리즘을 공부하고 직접 구현해보려고 노력하니까 알고리즘을 공부해야하는데.. 라는 불안감이 사라지고 새로운 지식으로 채워지는 시간들이었던 것 같다.
여기까지 글을 읽고 책을 읽어보고 싶다. 라는 생각이 드는 사람들에게 이 책을 소설책 읽듯이 후루룩 읽기보다는 기간을 정해 놓고 책에서 제시하는 알고리즘을 하나씩 익혀보며 책을 씹어먹는다는 표현이 들정도로 공부를 했으면 좋겠다는 이야기를 해주고 싶다. 비교적 급하게 책을 읽느라 이 책을 소개하고 있는 나 또한 책의 모든 내용을 이해하고 글을 쓰는 것은 절대 아니다. 앞으로 시간을 더 들여서 알고리즘 하나를 익혔으면 관련 문제들도 찾아서 풀어보고 하나를 완전히 내것으로 만들어가며 공부를 하고 싶다.
컴퓨터공학과에서 공부를 하면서, 졸업한 선배들의 이야기를 들어보면 비교적 컴퓨터 공학과는 타과에 비해 학점보단 본인의 실력이 중요하다는 이야기를 많이 듣는다. 그렇기에 단순 학교 공부를 넘어선 알고리즘과 같은 다른 공부들이 절실한 시점이라고 생각을 했는데 책을 읽고 여러 알고리즘을 하나씩 익히고 진짜 내 실력을 기를 수 있는 좋은 기회라고 생각한다.
이제 슬슬 뭐라도 해야할 것 같고 스펙도 쌓아야할 것 같고 알고리즘을 공부하고 싶은 컴퓨터 공학과 관련 학생들에게 이 책을 적극 권장하고 싶다는 의견을 전달하며 글을 마친다.
'글을 써봐요 > 그냥 글' 카테고리의 다른 글
뜻이 맞는 사람 (2) | 2024.06.22 |
---|---|
좋아한다는 것 (똥글) (0) | 2023.04.08 |