알고리즘의 기초 학습이 부족하다고 생각되는 분께 추천드리는 책임을 밝힌다.
이 책은 여느 책들과 비슷하게 알고리즘의 기초에서 시작하여 그 내용을 점점 심화하는 구성으로 이루어져 있다. 하지만 이때껏 필자가 리뷰하였던 책들과 다른 점이 있다면 파이썬을 이용해 우리가 일반 개발에서 사용되는 알고리즘의구체적인 내용들을 잘 정리하여 설명하고 있다는 점이다.
또한 인상적인 부분이 있다면 바로 각 알고리즘별 퍼포먼스를 잘 정리하여 술 하였다는 점이다. 가령 단계적으로 알고리즘을 최적화해가면서 퍼포먼스가 얼마나 향상되는지. 그리고 input case의 사이즈가 증가해감에 따라서 알고리즘의 특정 부분의 차이에 따른 퍼포먼스 격차가 얼마나 커지는지등을 잘 술하고 있다.
이런 부분에 대한 벤치마킹은 웬만한 책들에서는 이렇게 디테일하게까지 정리하지 않는 편인데, 이 책에서는 그런 내용들까지도 꼼꼼히 정리하여 독자들에게 제공하고 있다는 점에서 상당히 인상적이었다.
그렇기에 파이썬에 대한 언어의 기본적인 틀을 어느 정도 알고 있고, 컴퓨터프로그래밍 코드를 이용하여 기본적인 메인 루프를 구동해 본 경험이 있는 사람들이라면 이 책을 통해 충분히 알고리즘에 대한 가르침을 충만히 얻을수 있을 것이라 생각된다.
【책의 구성】 '똑똑한 코드 작성을 위한 실전 알고리즘'은 어떤 책일까?
솔직히 이 책은 알고리즘 기본기가 튼튼하게 쌓여있는 사람이학습하기에는 내용이 막입문하는 초급자 혹은 기본기를 튼튼히 하고자 하는 중급자에게 포커싱이 되어 있어서 썩 만족스러운 학습이 되지 않을 가능성이높다.
그렇기에 막 입문하려는 알고리즘 초보자나 혹은 기초를 다시금 튼튼히 하고자 하는 중급 수준의 알고리즘 풀이 능력을가진 분들이 학습하길 권한다.
또한 파이썬으로 알고리즘 풀이를 갈아타신 분들께서도 이 책을 통해 파이썬을 이용한 알고리즘 풀이에 대한 스킬을익히면 유용하지 싶다.
다만, 보통의 알고리즘 대회에서는 통상적으로 C/C++과 같은 native language를 활용한 풀이를 많이제출한다는 점을 명심하자. 왜냐하면 native Language 코드로구동한 (어셈블을 제외한) 알고리즘의 퍼포먼스는 아직 다른언어들에서 그 근사까지는 추적하였어도 그것들을 능가한 경우는 없는 것으로 알고 있기 때문이다.
1 장 : 문제 해결
알고리즘의 개념을 몇 가지 예를 들어가며 친절히 설명하고있다.
첫 예제로 가장 큰 값 찾기가 언급되었는데, 이는 알고리즘의 다른책들에서도 많이 사용하는 예제이므로 참고해두면 좋을 듯하다.
또한 책 내용에 설명을 돕는 그림들이 많이 있기 때문에, 그림을 심도있게 살펴봐두었다가 추후 자신만의 알고리즘을 구축할 때 응용하면 충분한 퍼포먼스 향상을 이뤄낼 수 있을 것이라 생각된다.
2장: 알고리즘 분석
이 장에서는 알고리즘의 성능 분석에 대한 관점과 성능 분석등에 대한 내용을 잘 술하고 있다.
이 부분이 솔직히 알고리즘 테스트나 알고리즘 면접을 준비하는 과정에서 제일 간과하기 쉬운 부분이다. 따라서 Big O Notation에 따른 시간 복잡도가 어떤 식으로변화하는지 그리고 이러한 알고리즘으로 1s 동안 몇 개의instruction set을 처리할 수 있는지 꼼꼼히 알아두도록 하자.
보편적으로 1초에 1억개의 instrution set이 수행될 수 있다고 가정한다. 다만현대의 CPU는 훨씬 정교해지고 최적화가 하드웨어 단에서부터(ALU) 잘 되어 있기 때문에 위의 통상의 기준이 더 이상 통용되지 않을 수 있음도 참고해두자.
3~7 장 : 보편적인알고리즘
학부에서 배울법한 알고리즘들은 3~7장에 모두 정리되어 있다. 따라서 스텝별로 꼼꼼히 학습해 보도록하자.
알고리즘은 언어를 떠나서 추상화 개념을 충분히 잘 인지하기만 하면 모든 언어에서 같은 형태로 구현이 가능하다. 따라서 책에서 묘사하고 있는 설명을 위한 그림들을 잘 머릿속에 새겨 넣어 두도록 하자.
【 똑똑한 코드 작성을 위한 실전 알고리즘을 읽고 나서.. 】
알고리즘은 책의 서문에서 번역을 맡으신 윤대석님의 말씀처럼하루아침에 고수가 될 수 있는 그런 학문이 아니다.
알고리즘 주제 하나만으로도 "도널드 리누스"는 몇 백 페이지에 이르는 책을 총 8권(아직 5권 정도 밖에 출간되지 못했다.)이나 집필하였기에 이러한 점만 보아도 해당 학문의 분야가 상당히 세분화되어있고 깊이가 상당하다는 것을 알 수있다.
그렇기에 알고리즘을 잘하기 위해서는 튼튼한 기초 위에 다양한 문제들을 주기적으로 학습함으로써 알고리즘과 관련된두뇌의 영역을 강화할 수밖에 없다.
또한 알고리즘은 단순히 문제만을 푸는 과정이 아니다. 알고리즘을 푼다는것은 하나의 프로그램 전체를 설계하는 과정과 같다고 할 수 있다. 특히나 검색과 같은 부분에 있어서키워드를 입력할 때 연관 키워드를 노출해 주기 위해서는 스트링의 부분과 매칭되는 유사 키워드들을 DB 등에서추려서 사용자에게 노출시켜야 한다. 이때 이러한 노출 부분의 스트링을 취득하는 과정에서 우리가 배웠던알고리즘들이 도입되게 된다.
즉, 알고리즘을 잘한다는 것은 한 프로그램의 전체를 이해하고 그 깊이를심도 있게 분석하여 이전과는 다른 훨씬 진보된 하나의 최적화된 프로그램을 잘 만들 수 있음을 간접적으로 증명하는 것과 같다.
따라서 하루에 한문제, 많으면 3문제. 매일매일 알고리즘 문제를 푸는 습관을 들이도록 하자.
필자의 경우를 예로 든다면, 필자는 릿 코드를 통해 알고리즘 스터디를즐겨 하는 편이다.
본 도서는 "한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공받아 작성된 서평입니다.