예전에 NodeJS로 간단하게 만들 일이 있어 예제가 많은 책을 찾다보니 NodeJS 200제라는 알다시피 요새 IT 개발쪽으로 취업을 하려면 필수 관문중에 하나가 알고리즘 테스트입니다. 또한 입사뿐만이 아니라 재직자들도 알고리즘 시험을 통해 여러 등급을 취득해야 되는 경우도 있어 중요해지는 것 같습니다. 저 또한 마찬가지 이유로 공부를 해볼까 하다가 리뷰 이벤트를 통해 이 책을 접하게 되었습니다. 요새 알고리즘 테스트에서 파이썬을 많이 도입을 하고, 책들도 파이썬으로 알고리즘을 설명하는데 기본 로직은 어느 언어나 크게 다르지 않기 때문에 파이썬이라고 책을 선택하시는데 고민을 하지 않아도 문제가 없을 것 같습니다. 내용은 파이썬에서 문장, 배열 등 기본을 다루는 연습을 시작으로 간단한 알고리즘을 구현해 보면서 기본기를 익힐 수 있게 내용이 구성되어 있습니다. 설명은 초보자가 이해하는데도 어렵지 않게 설명이 되어 있고, 저자분께서 중간중간 팁으로 표시 해놓은 부분은 꼭 한번 읽어보시면 도움이 될 내용이 담겨 있습니다.
책의 목차에도 있지만, 입문용 알고리즘, Brute Force, Stack, Hash, Prime, 물론 심화나 다양한 케이스는 온라인 저지등을 이용하거나 심화 책을 구입하셔서 보는 것도 좋을 듯 합니다. 그리고 저는 직접 코딩보다는 우선 처음은 책을 전체적으로 다 읽어보고 다시 보고 있는데 코드와 실습결과가 책에 같이 나와 있어서 따라하지 않아도 읽기 수월해서 좋았던 것 같습니다. |
우리는 왜 알고리즘을 공부해야 하는가?
컴퓨터의 하드웨어 연산능력은 급속히 향상되는 데다 가격은 저렴해지고 있고, 클라우드 서비스를 이용하면 이러한 자원을 필요할 때 원하는 만큼만 사용할 수 있기에 하드웨어는 더더욱 저렴하게 사용할 수 있을 것처럼 보이는데, 소프트웨어 프로그래밍은 인터넷에서 손쉽게 검색해서 사용할 수 있는 수많은 오픈소스 라이브러리가 있는 것을 사용하거나 클라우드 회사에서 제공하는 서비스를 그냥 써서 구현하면 될 것 같은데, 왜 굳이 힘들게 따분하고 현실과 동떨어진 것처럼 보이는 알고리즘을 공부할 필요가 있을까?
이 책을 펼치기 전에는 누구나 이런 의문을 가질 수 있겠지만, 책을 끝까지 읽어본 뒤에는 그 의문이 너무도 부질없는 것이었으며, 알고리즘을 모르는 것 자체가 얼마나 현실과 동떨어져 있는 것인지를 뼈저리게 느끼게 될 것이다. 우리가 ‘1+1=2’같은 프로그래밍만 취미로 만들며 살아간다면 모르겠지만, 요즘 같이 빠르게 디지털화가 되고 있는 시대에는 수천만 또는 그 이상의 동시접속자들의 까다로운 취향을 맞추기 위해 엄청난 데이터를 다차원으로 실시간으로 분석하면서, 시시각각 변화하는 그들의 요구에 끊김 없이 즉시 응답하는 온라인 서비스를 만들어야만 하고, 그것을 가능하게 하는 근간에는 효과적인 알고리즘이 있기 때문이다.
이 책에는 저자는 자신도 학창시절에는 알고리즘에 대해 어려움을 겪었다는 것을 고백하고 있다. 하지만, 회사에서 경험을 쌓은 뒤 이직을 결심하게 되면서 여러 코딩면접을 준비하게 되고, 당시 대부분의 책은 C언어 기반의 알고리즘만 다루고 있어, 저자가 직접 파이썬 기반의 알고리즘을 구현한 책을 집필까지 하게 된 것이 이 책의 탄생 배경이다.
“이 책은 알고리즘이라는 높은 산을 오르려는 독자들과 함께, 준비운동을 하고 기초체력을 기르는 것을 목표로 하고 있습니다.” (p.29)
저자는 알고리즘을 제대로 습득하기 위해서는 편법이나 요령이 아닌 정공법이 필요함을 강조한다. 그렇기에 직접 코드를 만들어 가는 실습을 중심으로 설명해주고 있다. 또한 알고리즘의 일반적 지식을 전달하는 다른 책과는 달리, 자신의 경험을 토대로 왜 알고리즘이 필요한지를 설명하면서 알고리즘을 단계별로 구현하고 따라할 수 있도록 해준다. 저자와 같이 단계별로 발생하는 에러 메세지를 의도적으로 접하게 하면서 그 원인과 해결 방법을 설명해주는 책은 지금까지 본 적이 없는 것 같다. 뿐만 아니라 각 단계별로 겪을 수 있는 여러 시행착오에 대한 자세한 설명과 격려를 통해 낙오자 없이 끝까지 완주할 수 있도록 성취감과 자신감을 갖게 해준다. 저자의 고뇌와 독자에 대한 많은 배려가 느껴지는 부분이다.
알고리즘에 대한 설명을 할 때 이해하기 쉽도록 우리에게 친근한 예제를 곁들여주고 있다. 예를 들면 스택을 하나씩 뽑아 쓰는 티슈나 통 안에 들어있는 감자칩에 비유한 것은 매우 기발하다는 생각이 들었다.
“알고리즘 문제를 풀 때는 처음에 무언가 한 줄이라도 코딩을 해봐야 시작할 수 있다. 계속 생각만 한다면 아무것도 못하고 결국 면접관에게 모른다고 해야 할 수 있습니다. 그렇게 된다면, 내가 원하는 회사에 갈 수 있는 확률이 그만큼 줄어듭니다.” (p.276)
긴장되서 아무것도 기억이 안나는 코딩테스트에서 땀을 뻘뻘 흘리며 고생하는 모습을 상상해보면, 이 한마디가 얼마나 절실히 와닿고 힘이 되는지 이해할 수 있을 것이다. 알고리즘 코딩테스트는 알고리즘을 알고 있어야만 대응할 수 있는데, 소위 말하는 기출문제뿐만 아니라 유형과 출제 빈도 등에 대해 책 전반에 걸쳐 접할 수 있다.
“실제 프로젝트에서는 코드 가독성이 중요하기 때문에 변수를 한두 번 더 사용하는 게 좋을 때도 있지만, 알고리즘 문제를 풀 때는 메모리를 적게 사용하는 것이 좋기 때문에, 공간 복잡도를 낮추기 위해서 변수는 최소한으로 사용해야 합니다.” (p.272)
이 책에서 가장 인상적인 부분은 단순히 알고리즘을 해결하는 것에서 그치지 않고, 실제 대용량의 데이터에 적용할 경우 어떠한 문제가 발생할 수 있고, 이에 대해 어떻게 대처할 수 있는지에 다양한 해법을 제시해주고 있다. 예를 들어 timestamp를 사용하여 대용량 데이터를 처리하는데 필요한 시간을 check 하고, 알고리즘의 업그레이드를 통해 어떻게 performance 개선이 이뤄지는지 다양한 관점에서 실증하는 사례를 제시해 실무에 매우 유용해 보인다. 보통 split()과 같은 스택 연산을 정규식(regular expression)을 사용하면 더 쉽고 빠르게 구현할 수 있을 것이라 생각되지만, 실제로는 그렇지 않을 수 있다는 것을 예제로 보여준다.
“해시는 앞서 말씀드린 것처럼 보안 분야에서 암호화 용도로 많이 활용됩니다. SHA-256과 같은 알고리즘이, 암호화를 위한 대표적인 해시 함수입니다.” (p.179)
“기본적으로 데이터를 전체에 골고루 뿌려줄 수 있는 좋은 해시 함수를 선택하는 것이 중요하며, 일반적으로 오픈 어드레싱(open addressing)을 활용할 경우 저장할 데이터의 두 배 정도의 공간을 미리 확보하여 충돌을 발생하는 상황에 대비하는 것이 좋습니다.” (p.197)
이러한 조언은 실무에 바탕을 둔 저자와 같은 경험에서만 나올 수 있는 것이어서 더더욱 소중하게 느껴진다.
개인적으로 이 책의 저자를 처음 접하게 된 것은 2018년 출간된 「한입에 웹 크롤링’」을 통해서이다. 웹 크롤링에 대한 국내 저자의 책이 거의 없었던 당시에 저자의 책을 읽고 매우 유용하게 잘 활용했던 기억이 있었는데, 이번에 새로운 책을 통해서 저자를 다시 만날 수 있어서 감회가 새로웠다.
코딩테스트 응시자들과 효율적 알고리즘을 구현하는 많은 개발자들에게 더할 나위 없이 좋은 책이 될 것으로 확신한다. |
https://book.naver.com/bookdb/book_detail.naver?bid=21431981
개발자 이직 준비중인 상황에서 신입 외에 경력들도 코딩테스트를 보는 추세라는 소식을 들었다. 실제로 몇 번 코딩테스트를 보기도 했고, 물 먹은 경험이 꽤 있던지라 고민되던 차에 이 서적을 알게 되었고, 리뷰 신청을 하여 받아보게 되었다.
![]() 표지가 꽤 귀엽다. 파이썬이 말랑말랑하다는걸 온몸으로 표현하고 있다. 참고로 이 책은 파이썬을 해본적이 있다는걸 전제로 알고리즘을 설명하고 있기 때문에, 아예 파이썬을 할 줄 모른다면 혹은 설치가 되지 않은 상태라면 그런걸 미리 한 후에 이 책을 보는 것을 추천한다.
책 내용을 보자면 스택 설명하는 부분인데, 알고리즘 문제는 다음과 같았다. "()" 이렇게 여는 괄호와 닫는 괄호가 짝이 맞는 문자열이 입력되면 True를 리턴하고 "()("와 같이 괄호의 짝이 맞지 않으면 False를 리턴하는 함수를 만들어보세요. ![]() 그런데 책이 대단하다 싶었던건 이 문제에 대한 답이 하나가 아니라는 것과 여러가지 방법으로 풀 수 있게 되어있다는 점이었다. 스택을 안 쓰고 괄호 풀 수 있을지 간단히 생각해보면서 답을 찾아가는 것부터 만약 이 문제에서 ()이 아닌 []나 {}이 나올때 어떻게 대처해야할지 등 문제 하나에 이렇게 다양한 방법이 있다, 답은 맞을지라도 시간이 오래 걸리니 다른 방법도 고려해볼 수 있다며 보여주는 것이 참 인상 깊었다. 특히 이렇게 풀면 되지 않을까? 해서 풀어봤을때 이런 에러가 나올 수 있다며 콕 찝어서 설명해주는 부분에선 이전의 코딩테스트에서 이거 분명히 되는건데 왜 에러가 나는지 당황했었던 때가 생각나서 좀 더 면밀히 보게 되었다.
이외에 브루트 포스나 정렬, 해시 등 다양한 주제들이 있으며 문제들도 위와 비슷한 방식으로 전개되니 코딩테스트 입문자들에게 큰 도움이 될 수 있겠단 생각이 들었다. 특히 찾아보기 페이지가 있고, 에러 메시지도 목록에 있어서 추후에 책 내용 찾아보기도 편하게 되어있었다.
아쉬운점은 430쪽 정도의 분량임에도 설명이 자세해서 그런지 모든 타입의 알고리즘에 대응하긴 어려워보였고, 중간중간 들어간 삽화(이미지)가 화질구지인 부분이 있다는 점 정도이다.
구입링크 Yes24: http://www.yes24.com/Product/Goods/106373453 알라딘: https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=287265300 교보문고: http://www.kyobobook.co.kr/product/detailViewKor.laf?ejkGb=KOR&barcode=9791165921064
이 리뷰는 비제이퍼블릭의 <말랑말랑 알고리즘> 리뷰단에서 책을 지원받아 작성하였습니다. |
저자의 사이트 블로그: http://krksap.tistory.com 유튜브: https://www.youtube.com/KyounRrock
최종 코드 https://github.com/bjpublic/Algorithm
이 책의 구성 이 책은 파이썬을 활용할 수 있는 독자들을 대상으로, 알고리즘 입문을 돕는 책이다 책의 실행 환경은 파이썬3이며, 도서는 3.8 버전에서 작성하였다
이 책에서는 1장부터 3장까지 알고리즘에 대한 기본 설명과 실제로 많이 활용되는 기본 알고리즘을 예시와 함께 배울 수 있다 그리고 4장부터는 코딩 테스트에서 많이 활용되는 핵심 알고리즘을 하니씩 설명하며 해당 알고리즘의 문제를 풀어 보는 방식으로 진행한다
서평 언제부터인가 거의 모든 IT회사에서 개발자 채용시 검증을 위해 알고리즘 테스트를 채용과정에 포함하고 있다 아에 처음부터 알고리즘 테스트 링크부터 전송하고 통과하면 그때서야 서류 검토부터 시작하는 곳들도 있을 정도로 개발자 채용에 가장 중요한 과정중에 하나가 되어가고 있다
하지만 대학교에서 이제 막 IT회사 입사를 준비하고 있는 학생들보다 실무에서 개발하고 있는 경력 개발자들의 경우 알고리즘 테스트에 훨씬 취약한 경우가 많다 예전에는 IT회사 채용과정에 알고리즘 테스트가 필수가 아니였으며 실무에서 개발을 하다보면 알고리즘 풀이 능력보다는 다른 능력들을 요구하는 경우가 훨씬 많기 때문에 알고리즘 풀이에 대한 훈련을 별도로 하지 않으면 잘하지 못할 수 밖에 없다
이 책의 저자도 현재 알고리즘 테스트에서 좌절하는 많은 개발자들 중 한명이였고 알고리즘 테스트에서 좌절을 해봤던 개발자였다
이 책의 저자는 자신이 직접 알고리즘 훈련을하고 풀이를 하면서 자신이 공부하고 이해한 내용들을 정리해 책으로 출간했다 보통사람들은 알고리즘 공부만 하기도 힘든데 그걸 또 정리해서 책까지 냈다니 보통 사람이 아님에는 분명하다
덕 분에 이책을 읽는 독자들의 눈높이에 맞춰서 매우 이해하기 쉽게 알고리즘을 공부하고 풀이해볼 수 있도록 잘 구성이 되어있고 풀이 과정도 책의 내용만으로도 충분히 이해할 수 있도록 잘 구성이 되어있다
물론 이 책의 알고리즘 문제들만으로는 각 IT기업에서 출제하는 알고리즘을 모두 풀이 해낼 수는 없지만 이 책을 통해 알고리즘을 어려워하는 개발자들이 어떻게 알고리즘 공부를 해야 하는지 어떻게 풀이를 해야되고 이 문제의 원리와 해답은 무엇인지 이런것들을 보다 쉽게 이해할 수 있다
이 책에서 알고리즘 문제가 출제되는 모든 케이스에 대해서 살펴보면서 직접 문제를 풀어보면서 진행해볼 수 있다
알고리즘 문제는 보통 스택, 해시, 소수, 탐색, 정렬, 재귀, 다이내믹 프로그래밍 등의 방식으로 구성이 되어있다 복합적으로 구성이 되어 있는 문제들도 있으며 난이도가 쉬운 것부터 어려운 것 까지 매우 다양하게 출제가 된다
일반적인 알고리즘 책의 구성처럼 모든 알고리즘 방식에 대한 케이스별 문제가 수록되어있고 그 문제를 풀어보고 풀이 과정을 보고 해답까지 도출 해낼 수 있도록 잘 구성이 되어있는 서적이다
정말 알고리즘 풀이를 못하는 완전 초보자들이 대상이라 책의 초반부에 배치된 입문용 알고리즘 부터 차근히 풀어나가면서 이해가 안되면 풀이를 보고 다시 풀어보고를 반복하면서 점차 진도를 나가다 보면 이 책 한권정도는 충분히 마스터할 수 있을 것이다
이 책의 저자가 강조하는 것은 알고리즘 문제들에 대한 풀이에만 집착하는 것이 아니라 알고리즘을 풀고자하는 언어에 대한 문법에 대해서 완벽히 숙지하고 있어야 하고 자료구조와 알고리즘의 개념을 잘이해하고 있어야 하며 직접 알고리즘을 작성하고 충분히 소화하면 다른 알고리즘 문제들도 충분히 해결해낼 수 있는 능력이 생겨날 것이라고 한다
알고리즘은 반드시 하나의 풀이방법만 존재하는 것이아니라 다양한 방식으로 풀어낼 수 있다 하나의 문제를 다양한 방법으로 문제를 풀이해보면 또 다른 문제들에 대해서도 쉽게 해결해낼 수 있는 능력이 키워질 것이다
총평 이 책의 저자는 개발자 채용시 알고리즘 테스트를 보며 좌절을 맛봤었고 자신이 어려웠던 알고리즘 테스트를 직접 공부하고 연습하면서 정리한 내용들을 책으로 집필했다
자신이 정말 초보자의 수준에서 직접 학습하며 공부하고 정리한 내용들로 구성된 책이라 초보자 입장을 많이 배려했고
정말 쉽게 이해할 수 있도록 잘 구성이된 알고리즘 서적이라고 생각된다
물론 알고리즘은 끊임없이 풀어보고 훈련을 해야되는 부분이 있지만 너무 어려워 아에 접근 조차도 할 수 없다면 결국 시도조차도 못해보는 것이기 때문에 저자는 최대한 초보자들이 첫 발정도는 디딜 수 있도록 쉽게 알고리즘 문제 접근 법을 알려주고 있다
개발자 채용 알고리즘 테스트에서 수많은 좌절을 겪고 있는 개발자라면 이 책을 한번 정독 해보기를 추천 한다
※출판사로부터 책을 무상으로 제공받아 직접 실습해보고 정성껏 작성한 리뷰 입니다 |
아마 IT회사 취업을 목표로 하는 사람이라면 누구든 코딩 테스트에 대한 준비를 할 것이다. 흔히 네카라쿠배 라고 하는 상위 IT기업들만 하더라도 입사를 위해서는 코딩테스트나 코딩 과제를 제출해야하고, 이를 준비하는 교육 과정과 책들이 시중에도 많이 나와있다. IT 게시판같은 것을 살펴보면 이 코딩테스트의 필요성에 대해서 의견을 주고받는 내용들이 있는데, 코딩테스트에서 다뤄지는 알고리즘이 실제로도 사용되느냐에 대해서 의견이 분분하지만, 그래도 이런 테스트를 통해서 현업에서 필요한 사람을 뽑을 수 있다는 것에 대해서는 의견이 일치하는 것 같다. 정상적으로 SW를 다루는 학과를 이수했다면 아마 알고리즘이나 자료구조론 수업을 들었을 것이고, 결국 학교에서 배운 내용을 잘 이수한 실력있는 사람이라면 충분히 코딩 테스트를 통과할 수 있는 사람이 되는 것이다. 솔직하게 고백하자면 나도 이 코딩테스트에 대해서 막연한 불편함을 가지고 있는 사람이다. 나 스스로도 코딩을 잘한다고 생각해본 적이 없고, 코딩테스트에 나오는 문제를 살펴보면 내가 과연 저 문제를 시간안에 풀 수 있을까? 지금 회사에서 시험을 본다면 나는 붙을 수 있을까? 하는 생각을 가끔 해본다. 그래도 실무에서도 이런 능력이 필요하다고 느끼는 상태였고, 나름 자료구조부터 응용된 문제까지 차근차근 설명해주는 책을 찾는 과정에서 이번 책을 선정하게 되었다.
![]()
앞에서 언급했던 것처럼 시중에는 다양한 코딩테스트를 준비할 수 있는 책들이 출판되어 있고, 각각의 책들이 나름의 방향을 가지고 있다. 어떤 책은 진짜 테스트에 나왔던 문제를 바탕으로 문제은행식으로 담아놓은 책들이 있고, 혹은 TopCoder나 ACM-ICPC에 나왔던 문제들을 바탕으로 설명한 책들도 있다. 그리고 또다른 책은 개인의 경험을 바탕으로 초기의 이론부터 이론을 잘 활용할 수 있는 문제를 푸는 방향으로 진행되는 책들도 있는데, 이 책도 어떻게 보면 후자의 방향으로 따라가는 책 중 하나라고 볼 수 있다. 부제로 달려 있는 "차근차근 설명하고 막힘없이 이해하는 알고리즘"이란 내용이 책의 전반적인 내용을 요약한 것이라고 생각하면 좋을 것 같다. 그래서 뭔가 중급자의 입장에서 다양한 문제의 경향을 파악하고자 사람에게는 뭔가 부족해보일 수 있지만, 자료구조부터 처음부터 구현하면서 시험에서 많이 언급되는 문제들을 풀어보고 싶다 하는 입문자에게는 추천할만한 부분들이 담겨 있다. 책에서 다뤄지고 있는 상세 내용 및 문제는 다음과 같다.
개인적으로 좋았던 부분은 외부 라이브러리에 의존하지 않고 직접 구현하면서, 딱 이것이 정답이다 하고 답 코드를 제시하는 것이 아니라 답까지 도출되는 과정을 하나씩 밟으면서 내용이 진행되는 점이다. 그래서 그런지 책 자체에 담고 있는 문제나 주제가 여타 알고리즘 관련 책에 비하면 많지 않음에도 책의 분량이 상당한 편이다. 그리고 책의 세부 파트도 결국 답에 해당하는 부분을 하나씩 구현하면서 설명되기 때문에, 문제에 익숙하지 않은 사람은 처음부터 하나씩 구현을 따라해보는 과정을 밟으면서 배울 수 있게 되어 있다. 나도 회사내에서 SW 역량인증 시험을 준비하는 입장에서 물론 기출문제를 살펴보고 시험의 유형에 익숙해지는 것도 중요하겠지만, 기초부터 살펴보면서 머리속에서 좀 "생각"을 하면서 구현해보는 과정도 필요하다고 생각하며, 그런 측면에서 보면 이 책이 목적에 맞는 책이 아닐까 생각한다. (참고로 책에서 제공하는 예제 파일은 웹사이트에 공유되어 있지만, 되도록이면 책의 내용을 살펴보면서 직접 해보는 것을 추천한다. 앞에서 언급했다시피 이 책은 답이 딱 주어져서 의미가 있는 책이 아니라 진행 순서대로 구현해보면서 경험을 쌓는데 의의가 있는 책이기 때문이다.) (해당 포스트에서 소개하고 있는 "파이썬으로 익히는 말랑말랑 알고리즘" 책은 BJ퍼블릭으로부터 제공받았음을 알려드립니다.) |