인사이트 '알고리즘 트레이닝'을 후닥닥 읽고...
1장 도입부를 읽어보면 아래와 같은 문장으로 시작합니다.
누군가가 분명 이미 풀어낸 문제들인 것이다.
앗! 누군가 이미 풀어버린 문제라니... 사실 당연한 것인데 잠시 당황했습니다. 다른 사람보다 조금 더 빨리 문제를 풀 때 중독적인 쾌감이 있는데, 그 쾌감이 반감될 것 같네요.
책 초반은 원서 제목 'Competitive Programming'에 맞게 경진대회에서 알아야 할 유익한 내용으로 가득 채워져 있습니다. 특히 첫 장을 넘기면 갑자기 문제 하나 툭 던져놓고 경진 대회의 능숙함 정도를 평가당합니다. 혹시 기대에 미치지 못해서 '앗! 책을 잘 못 선택했나?'하는 생각이 들 수도 있지만, 꾹 참고 1장을 끝까지 읽고 판단하시길 권해 드립니다.
책에 실려있는 소스에는 주석들이 꼼꼼히 작성되어 있습니다. 그리고 번역까지 자연스럽게 되어 있어 이해하는데 많은 도움을 받을 수 있습니다. 첫 번째 주석은 아래와 같습니다.
소프트웨어 분야 실무에서 전역 변수를 사용하는 것은 나쁘지만
경진 프로그래밍에서라면 괜찮다.
남보다 빨리 풀어야 하는 경진 프로그래밍 특성상 전역 변수 사용은 정말 매력적인 존재입니다. 함수 파라미터 수도 줄여 타이핑도 적게 하고, 메모리도 효율적으로 사용해서 프로그램 속도까지 높일 수 있습니다. 단, 변수명을 명확하게 짓는 연습을 충분히 하시길 권해드리며 경진대회에서만 사용하시길 바랍니다.
저는 짧은 변수명에 주석을 간단히 달아놓는 방법을 이용하고 있습니다.
int ad = 0; // afterday;
double du = u; // distance
double ch = 0; // cur height;
double fd = u * f / 100.0; // fatigue distance;
경진에 능숙한 프로그래머라면 3중 이상의 루프를
편안한 마음으로 코딩할 수 있어야 한다.
책을 읽다가 갑자기 저 문장이 훅! 나타납니다. 초반 자체 평가를 당했다면, 이번에는 한 문장으로 능숙한 프로그래머 여부를 재확인시켜 줍니다. 사무실에서 소스 검토할 때 들여 쓰기가 3개 이상이면 일단 '이런 XXX 같은...'이라고 생각하며 검토를 시작합니다. 저는 3중 이상의 루프가 편안하지 않습니다. 제프 딘 정도가 아니어도 여기 있는 문제를 다 풀면 3중 루프가 편안해질까요? 언제 가는 여기 있는 문제 다 풀어보고 다시 저 문장을 읽어봐야겠네요.
... DP(동적 계획법)가 유용하다는 사실에 감사한 마음을 갖게 되도록...
리뷰 기간이 정해져 있어 전체적으로 대충 읽을 수밖에 없었습니다. 그중 3.5 DP 장은 DP애 감사한 마음이 생길 만큼 잘 작성되었있다는 사실을 확인할 수 있었습니다. DP를 써야 하는 곳에 다른 문제 해결법을 쓰면 어떻게 되는지, 그리고 탑다운 DP, 바텀업 DP가 어떻게 다른지, DP에 대해 잘 모르신다면 꼭 읽어보길 권해 드립니다.
이 책에서 다루고 있는 내용의 범위가 넓고 깊기 때문에
이 책은 한 번이 아니라 여러 번 읽어야 하는 책이다.
사실 이 책을 가장 잘 표현한 문장인 것 같습니다. 정말 다루고 있는 범위가 넓습니다. 적어도 '*'표된 연습문제만이라도 풀면서 읽어야 될 것 같아, 다시 첫 장으로 돌아왔습니다. 그리고 아래 주소에서 문제를 풀면서 다시 읽고 있지만, 문제를 푸는 속도보다 번역해서 이해하는데 더 오랜 시간이 걸리네요.
https://github.com/daejinseok/UVa
그동안 여러 경진대회 관련 책을 보았지만 이처럼 많은 문제를 잘 정리한 책은 보지 못했습니다. 처음 알고리즘을 배우는 데는 적합하지 않아도, 경진대회를 준비함에 있어 충분한 연습을 통해 상위권에 입상하기 위해서는 꼭 필요한 책이라 생각합니다.
충분히 읽고 리뷰를 작성하고 싶었는데 그러지 못했네요. 추후 다시 보완하도록 하겠습니다.
오늘도 즐겁고 행복하게 에어컨 바람 쐬면서 코딩하세요. ^^/
본 리뷰는 도서출판 인사이트에서 제공된 책으로 작성되었습니다.
http://www.insightbook.co.kr/