|
4차 산업혁명의 시작이 대두되며 인공지능, 소프트웨어, 사물인터넷의 등장과 함께 알고리즘 또한 각광받기 시작하고 있습니다만, 전공자가 아닌 이상 "알고리즘"이라는 분야는 아직 생소하기만 합니다. 컴퓨터 전공을 하는 사람들의, 그들만의 리그라고나 할까요? 컴퓨터 전공을 하는 사람들에게도 쉽지 않은, 이 '알고리즘'이라고 하는 분야에서 인사이트 출판사는 '알고리즘 문제 해결 전략'이라는 아주 좋은 책을 이미 출판했음에도 불구하고 '알고리즘 트레이닝'이라는 또 한권의 도서를 출간합니다. 사실 개인적으로 '알고리즘 문제 해결 전략'을 읽어본 사람으로써는 프로그래밍 언어에 대한 깊은 이해 뿐만 아니라 수학에 대한 대학 전공자 수준의 이해가 있지 않으면 난이도가 좀 있는 책이라고 생각합니다. '알고리즘 트레이닝' 또한 마찬가지인데요. 책의 타겟 독자층 또한 알고리즘 입문자나 알고리즘 관련 대회 초급 수준의 독자들은 첫장부터 숨이 막힐 만큼 난이도가 다소 높을 수도 있습니다. 최소 알고리즘과 관련된 입문서 1~2권 정도와 함께 주로 사용할 프로그래밍 언어 도서 1권은 함께 하시면 좋을 것 같습니다. - 각 장별로 다루고 있는 내용(참조 : 인사이트 사이트 http://www.insightbook.co.kr/archives/11923)
내용 자체는 번역서임에도 불구하고 굉장히 깔끔하고 잘 정렬되어 있습니다. 각 장별로 개요 및 동기를 통해 대회의 어떤 부분에서 해당 알고리즘이 사용되는지(혹은 난이도나 출제 빈도 등) 안내하고 있으며, 이는 '알고리즘 트레이닝'을 바탕으로 학생들을 가르치는 교사나 강사, 교수 등의 분들에게 매우 유용할 것으로 보입니다. 또한 UVa와 연계하여 약 1600여개의 예제 및 힌트, 문제 풀이, 자료 구조와 라이브러리 목록을 제공하기 때문에 독자들에게 정답을 맞춰 볼 것을 강요(?)하는 일부 도서들과는 달리 필요한 알고리즘 부분을 찾아보고 공부할 수 있는 장점이 있습니다. 그러나 책 자체가 매우 두껍기 때문에(600페이지가 넘는 분량) 찾아보실 때는 반드시 목차를 보셔야 알 수 있습니다.
다만 외국 원서에 대한 번역본이라 그런지 전반적으로 ACM-ICPC에 대한 이야기가 많이 나오며(이 부분은 다른 분의 리뷰에서도 찾아볼 수 있었습니다) 책을 읽는 독자들에겐 다소 괴리감이 느껴질 수도 있습니다. 워낙 방대한 양에 약 2주 정도의 시간임에도 많은 부분을 보진 못했지만 알고리즘과 자료구조에 대해 사전 지식을 갖춘 학생의 말로는 지금까지 봤던 알고리즘 책 중에서 굉장히 상세하고 깊이 있는 내용을 다루고 있다는 이야기를 들을 수 있었습니다. 또한 국내 알고리즘 대회를 준비하고 있는 입장에서 기존의 알고리즘 책에서 이론만 다루었던 부분이나 두루뭉술하게 넘어갔던 부분들에 대해 짚어보고 실제로 예제와 힌트를 바탕으로 다뤄볼 수 있어 알고리즘의 바이블(!)이라 불려도 손색없을 것 같다는 감탄사도 곁들였습니다. 자료구조와 알고리즘을 공부할 수록 "어렵다"는 생각이 매번 듭니다. 책에 나와있는 것보다 더 간결하거나 더 쉽게 풀어낼 수 있는 문제들도 많이 존재하겠지요. 사람마다 풀어내는 방법이 다르기에 알고리즘이 잡힐 듯 하면서 잡히지 않는 이유도 그 때문일 것입니다. 그런 분들에게 '알고리즘 트레이닝'이 어쩌면 알고리즘에 대한 가이드 북으로써 이해를 돕고, 문제를 해결하는 하나의 방법(혹은 힌트)을 제시함으로써 다른 여러 방법으로 해결할 수 있는 실마리를 제공할 수 있지 않을까? 라는 생각을 해 봅니다. 또한 국내외 경진대회를 준비하거나 한 단계 도약이 필요한 프로그래머 혹은 학생, 알고리즘 관련 교육이 필요한 교수자에게도 충분한 도움이 될 수 있는 책이라고 생각합니다. 본 리뷰는 도서출판 인사이트에서 제공된 책으로 작성하였습니다. |
|
일단 이 책의 제목은 상당히 매력적이며 독자를 유혹하기에 충분한 것들로 쓰여져 있다. ACM ICPC, IOI/KOI, 자료구조.. 마치 이 책은 이 모든 것들을 해결해줄 최고의 비책인 것 처럼 다가오고 있다. 인사이트가 발행하고 있는 다양한 알고리즘 혹은 관련 책들을 읽어본 독자라면 비슷한 연장선에서 책의 내용을 예상하고 읽을 준비를 하고 있을 것 이다. 먼저 이 책은 너무나도 유명한 사이트인 UVA online 저지의 메인 페이지에도 링크가 걸려 있는 책의 번역본이다. 아래 uva 사이트의 캡처 이미지를 보면 책의 이미지와 uva hunting 사이트 까지 보이고 있으며 이는 이 책의 저자가 만든 사이트이며, uva의 다양한 문제들을 조금은 편리하게 풀어볼 수 있도록 만든 사이트라고 하니 관심 있는 분들은 해당 사이트를 방문해 봐도 좋을 것이다. 개인적으로 번역본을 읽을 때 원서의 표지를 꼭 같이 찾아보려고 한다. 뭐랄까 그것이 주는 소소한 재미도 있지만 책을 바라보는 각국의 시선 그리고 말 그래도 번역자의 관점 출판사의 관점들이 나름 녹아들어가는 작업이니까 말이다. 이 책의 원서 표지는 다음과 같다. 무엇보다도 이 책의 저자들이 관심이 가는 것은 그들이 형제이고 그들이 싱가포르인이라는 어찌보면 동양인이라는 공감도 있는것 같다. 더군다나 저 표지는 우리에게 익숙한 빅오가 아닌 하향선을 나타내고 있는 빅오메가가 아닌가. 물론 저 화살표의 의미는 추측하기가 쉽지 않다. 슬랙에 있는 어떤 지인들은 저 표지를 보고..." 결국 3명중에 한 명만 통과하는 것 아니냐는 .."상당히 당혹스러운 이미지의 해설 결과를 내놓았다. 아무튼 여기까지는 책의 내용과는 상관 없는 표지와 관련된 몇 가지 이야기들이며 이는 책을 선택하는데 큰 관련은 없을 것이라고 생각을 한다. 책의 구성 및 특징 문제 해결 관련 다양한 책들이 있다. 일단 인사이트의 책으로만 한정을 시키고 보자. 아주 많은 사람들이 보는 구종만씨의 "프로그래밍 대회에서 배우는 알고리즘 문제 해결전략"과 동일하게 각 주제에 대한 이론적 설명과 해당 이론들을 검증해보고 테스팅 해보고 자신의 실력을 살펴볼 수 있는 다양한 문제들의 제시로 이루어진 점은 동일하다고 볼 수 있다. 다만 구종만씨의 책이 플랫폼을 알고 스팟으로 삼았다면 이 책은 uva 의 다양한 문제들을 그 풀어야할 대상으로 제시하고 있다. 개인적으로 느끼는 난이도와 친절함의 차이는 확실히 전자가 더 친절하다. 비교를 하자는 것이 목적이 아니므로 이 책이 편하게 읽힌다는 것은 그 만큼 실력이 뛰어난 사람이라는 것이다. 단순히 책이 표지에 있는 것 처럼 이 모든 것들을 위해서 이 책으로 시작하는 것은 확실히 불편할 것이라는 것을 말하고 싶다. 어떤 책이든 아는 만큼 보이고 아는 만큼 저자가 말하려는 것을 더 이해하고 공감하게 되는 것이다. 그렇다. 난 아직 이 저자들의 모든 것들을 받아들일 실력이 부족한 것이다. 모든 파트들이 중요하지만 가장 재미있게 읽었던 부분을 보며 이 책의 흐름을 간단하게 다시 한번 살펴 보자. 살펴볼 부분은 세그먼트 트리를 기술하고 있는 이 책의 2장 "자료 구조와 라이브러리"이다. 아래 그림은 구간 트리를 설명하고 있는 부분이다. 책을 읽으면서 번역의 어색함은 전혀 느끼지 못했다. 문제 해결에 전문가인 번역자의 경험이 그대로 녹아 있어서 그런지 어색함이 없는 부분 역시 큰 칭찬을 해드리고 싶다. 설명은 뭐랄까 군더더기가 없는 깔끔함이 느껴진다. 그 만큼 저자와 역자의 실력이 드러나는 부분이며 이것이 편하게 읽힌다는 것은 자신이 뛰어나다는 것이다. 참고로 "전 그렇지 않았습니다.ㅠ.ㅠ." 책의 설명에서 필요한 다양한 시각화 자료들이 친절하게 설명되고 있는 것도 나쁘지 않다. 다만 그래프 등을 표현하는 어떤 그림에서는 크기가 너무 작거나 살짝 흐리게 인쇄된 것들이 있기도 하다. 개인적으로 이전에 알고 있었던 visualgo 사이트가 책의 저자인 "스티븐 할림"이 만들었다는 것이 놀라웠다. 역시나 아래 사이트를 참조해보며 책을 보는 것도 나쁘진 않다는 생각이 든다. https://visualgo.net/en/sorting 또한 다양한 연습 문제 - 그것을 푼다는 전제하에 -를 제시하고 있고 그 문제 들에 대한 풀이도 선별적으로 제공되고 있어 공부하기에는 나쁘지 않다. 다시 한번 말하지만 그것을 푼다는 전제하에 말이다. 그리고 재미있는 것은 특정 자료 구조에 대한 발명자의 프로필도 책을 읽는 재미를 주고 있는 것 같다. 저자들의 사진이 아니라 발명자의 사진이 들어갔어도 나쁘지 않았을 것 같다는 생각도 해본다. 그리고 가장 핵심은 이 책을 가지고 연습할 수 있는 병행 사이트가 uva인 만큼 uva 각 문제에 대한 링크를 제시하면서 꼭 풀어봐야만 하는 문제들을 제시해주는 것도 책이 가지는 큰 장점중에 하나라고 생각한다. 이 점은 자체 채점 사이트를 가지고 책을 출판하는 형태에서는 나타나는 패턴일 것이다. 정리하자면 책의 구성은 이론적 설명과 연습문제, 프로그래밍 문제(uva 연계), 풀이, 정리 와 같은 형태를 지닌다. 각 챕터별로 자료구조 발명자에 대한 설명과 저자들의 사진 같은 것들이 있어 잠시나마 쉬어갈 수 있도록 해주는 형태를 띄고 있다. 좋은 구성이라고 생각이 되며, 문병로 교수님의 추천사에 적힌 대로 문제의 분류, 지식의 소개 그리고 무엇보다도 더 중요한 것은 생각하는 방법이 아니겠는가. 그리고 사실 그것이 제일 어렵다. 아쉬운 점 사실 이 책을 읽으면서 아쉬운 점을 찾아낼 만큼의 실력이 없어 이 책의 아쉬운 점을 찾지를 못하겠다. 다만 책을 읽는 중에 acm-icpc 이야기가 많이 나오고 사실 그 대회는 세계 최고의 대화가 아닌가. 살짝 소외감과 뭐랄까 너무 높은 경지의 단계들에 대한 초심자의 안타까움 같은 것이 느껴지기는 했다. 좋은 점 및 결론 확실히 고수가 쓴 것 그리고 고수가 번역한 것이라는 것이 느껴지는 책이다. 그 만큼 저자는 자신들의 지식을 한 권에 담아내려고 노력했으며 중간 중간 저자들이 쓴 멘트 역시 그들이 competitive programming을 하면서 느낀 점들을 제시하고 있으며 그 문구들은 상당히 인상적이다. 문제 해결을 어느정도 경험하고- 그것이 대회든 개인적 연습이든- 그리고 몇 권의 책을 통해 각 분야에 대한 이론과 프로그래밍을 경험 했다는 전제하에 이 책을 본다면 더 많은 것을 얻을 수 있다는 생각을 해본다. 개인적으로 이 책으로 처음 시작하기에는 쉽게 읽히지 않겠다는 생각도 해보게 된다. 이 책의 저자도 서문에서 언급하고 있듯이 "이 책에서 다루고 있는 내용의 범위가 넓고 깊기 때문에 이 책은 한 번이 아니라 여러 번 읽어야 하는 책이다." 이 책을 만약 한 번 읽고 모든 것을 이해했다는 사람을 만난다면 평생의 친구로 가도 좋을 것 같다. 개인적으로는 자료구조 라이브러리, 문제 해결 패러다임, 그래프의 뒷 챕터인 기하, 고급 주제, 희귀한 주제들은 어려워서 잘 읽히지가 않았다. 다시 한 번 천천히 봐야겠다는 생각을 해본다. 직업이 직업이니 만큼 2015 개정 교육 과정의 과학 계열 전문 교과인 "정보과학"의 알고리즘 부분의 목표를 잠시 살펴보자. "컴퓨팅 사고력이 기반이 되어 실생활 및 다양한 학문 분야의 문제를 추상화하고 컴퓨팅 기기에서 자동화 할 수 있는 알고리즘적 사고와 프로그래밍 역량을 함양한다" 이를 위한 교육 과정의 내용 체계는 다음과 같다. 정보과학을 예로 든 것은 수준이 제일 높기 때문이다. 1. 문제와 알고리즘 - 알고리즘 복잡도 2. 탐색 기반 알고리즘 - 전체 탐색, 탐색 공간의 배제 3. 관계기반 알고리즘- 관계 정의, 동적 계획법 사실 위의 3가지를 위해 이 책을 참고한다면 이 책은 너무 어려운 책이 된다. 교육과정의 참고를 위해 책을 보는 것이 아니니 사실 큰 관련이 없을 수 도 있지만, 근무하고 있는 학교의 아이들은 이 책의 수준 만큼 뛰어난 아이들이 많으며 그들을 위해서는 직접 뛰는 축구 감독이 아니더라도 - 그러나 대부분의 축구 감독은 예전에 축구를 잘 했었다..ㅠ - 그들과 이야기를 하고 이해할 수준은 되어야 하지 않겠는가. 그런 면에서 본다면 이 책은 무엇을 더 공부해야 하는지 그리고 무엇이 부족한지를 일깨워주는 책이기에 유쾌한 경험으로 다가온다. 부족함을 깨달았으면 공부를 하면 되는 것이다. 그것이 비록 시간이 오래 걸릴지라도 말이다. 이러한 스타일의 문제들이 실생활의 문제가 아니고 좀 어렵지 않느냐는 의견을 들을때가 많다. 하지만 이러한 문제 해결의 과정에서 경험하게 되는 것은 확실히 교육 과정에서 언급하고 있는 요소들인것 같다는 생각도 해본다. 암튼 결론은 즐기면서 공부를 해야 한다는 것이다. 마지막으로 저자들의 말로 부족한 리뷰를 대신한다. "연습이 있어야 경험이 쌓이며, 경험이 쌓여야 능력이 된다. 그러니 계속 연습에 매진하기 바란다." "경진 프로그래밍을 잘 하는 것은 최종 목표가 아니며, 목표를 향한 하나의 수단일 뿐임을 유념하기 바란다. 궁극적 목표는 더 나은 소프트웨어를 만들고 더 어려운 컴퓨터 과학 연구 문제를 다룰 준비가 잘 되어 있는 미래의 만능 컴퓨터 과학자 및 프로그래머를 길러내는 것이다." 진짜 결론 및 첨가: 이 책은 나 한테는 정말 어렵다. 문제를 풀어볼 수 있는 사이트들이 국내외 적으로 대단히 많고 확신이 되고 있다. 이 책에서 언급하고 있는 uva 혹은 구종만씨의 알고스팟 그리고 많은 사이트 들이 있다. 그러나 국내에 있는 현직 정보 교사들에 운영되고 있는 자랑스러운 사이트를 소개해 본다. 개인적으로 운영하시는 분들에게 감사의 뜻을 표한다. 1. 코드업 http://codeup.kr/ 2. 코이스터디 http://koistudy.net/ |
|
<이 책은 '인사이트'로 부터 책을 지원받아 작성된 글입니다.> [ 책소개 ] Competitive Programming 자료 구조 및 알고리즘에 대한 기본 지식을 바탕으로국내외 프로그래밍 경진대회나 각종 알고리즘 테스트를 대비해문제 해결 능력과 효과적인 코드 구현 방법을 훈련할 수 있도록 구성된 책독자의 프로그래밍 역량을 한 단계 높여줄 명저많은 프로그래밍 관련 서적이 단순히 문제들과 그 풀이로 구성된 경우가 많은데 이 책은 문제들을 분류한 다음, 각 주제에 대한 기초 지식부터 소개한다. 정보 올림피아드로 훈련된 저자의 방대한 경험을 토대로 정성스럽고 효율적으로 쓴 명저다. 프로그래밍이라는 것은 단순히 프로그래밍 언어를 사용하는 기술이 아니고, 문제나 상황에 대한 체계적인 사고와 해법이 선행된 다음 마지막 절차인 구현 단계에서 프로그래밍 언어를 통할 뿐이다. 이 책은 여러 가지 주제에 대해 생각하는 방법, 생각의 기본을 제공하는 이론적 기초, 효율적으로 문제를 해결하는 팁 등을 제시해 독자들의 역량을 한 단계 높여줄 것이다. [ 목차 ] 옮긴이의 글 [ 책을 읽으며... ] 선수지식이 필요합니다. 이 책은 초보 프로그래머를 대상으로 쓰인 책이 아니다. 라고 나와있다. 책 목록만 봐도 알겠지만 알고리즘 자체가 처음 프로그래밍을 접하는 사람이나 알고리즘에 대한 기초지식을 쌓기 위한 독자에게는 어울리지 않는 책이다. 어느정도 알고리즘 대회에 관심이 있고 알고리즘에 대한 이해가 있는 사람들에게 맞는 책이다. 이 부분은 책을 구입하기 전에 가장 먼저 알아야 할 부분이다. C/C++ 책을 보다보면 C/C++ 그리고 JAVA. 세 종류의 언어를 사용해서 알고리즘을 구현하고 있는 모습을 볼 수 있을 것이다. 그래서 선수 지식이 필요하다고 하는 것이다. 이 책은 알고리즘 책이지, 언어에 대한 기초 문법을 알려주는 책이 아니기 때문이다. 다양한 예제 그리고 연습문제 책을 읽으면서 몰랐던 알고리즘에 대해 많이 알게 되었다. 대회 문제라서 그런지 몰라도 난이도가 높은 문제들이 가득하다. 공부를 해서 다 사용할 수는 없더라도 어떤 문제가 있을때 어떤 알고리즘을 쓸 수 있는가에 대해서는 공부 할 수 있었다. 나만 그런 생각이 드는지 모르겠지만 이 책은 가독성 면에서는 조금 불편함이 많다. 코드를 풀이하는 알고리즘 책이기 때문에 가독성이 좋을 것이라 생각했는데 필요없는 문장이 많아서 정작 중요한 내용은 눈에 들어오지 않은 경우가 종종 발생했다. 장마다 마지막 부분에 '이번 장을 마치며' 와 틈틈이 있는 '연습문제'가 생각을 정리하는데 꽤 많은 도움을 준다. [ 마무리 ] 이 책을 구입하기 전에 알아야 할 것은 단 하나! 알고리즘 기법을 위한 책이 아닌 대회와 관련 된 알고리즘이 주를 이루고 언어 문법은 이미 알고 있어야 할 것! 디자인 ★★☆☆☆ 표지가 너무 어지러움 내용 ★★★☆☆ 신기하게 푸는 알고리즘도 많다 난이도 ★★★★★ 난이도 최상 |
|
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/ |