알고리즘 인사이드 with 파이썬

알고리즘 책을 펼쳐본 게 얼마만인지 기억이 잘 나지 않는다.

분명 작업하면서 참고할 목적으로 학교 다닐 때 대학교수가 만들어 출간한 알고리즘 책을 교제로 봤던 것 같은데, 그 뒤로 몇 권인가 언어를 달리 하면서 알고리즘 책을 사서 봤던 걸로 기억한다.

문제는 처음부터 끝까지 다 읽어내진 못했다. 게을러서였는지 아니면 설명을 읽어보고 이해가 잘 되지 않게 매우 학술적으로 써서 거부감이 있었던 건지도 모르겠다.

근래 공부를 조금씩 하기로 작정한, 그래서 인강으로 파이썬 초급 과정을 보고, 뭔가 확인해보고 싶은 마음에 이 책, 저 책 보다가 발견한 게 이 책이다.

구성은 매우 간단하다. 문법, 기본 자료구조 및 알고리즘, 그리고 이를 응용해 풀 수 있는 문제들. 뭔가 독창적이라거나 학술적인 방식이 아니라, 기본에 충실하면서도 설명과 예제와, 이를 시각적으로 표현하는 그림들과 그 전개 설명, 그리고 이를 바탕으로 하는 알고리즘 풀이 문제들, 그것도 leetcode.com에서 추려낸 문제들. 다시 말해 어중이 떠중이 문제가 아니라 이미 검증이 된 문제들이라는 말이다.

알고리즘 책들이 흔히 저지르는 실수는 정말 간단하다. 너무 학술적으로 접근하는 경향이 있다는 것. 이는 내가 그 알고리즘을 이해하는 데 사실 1도 도움이 되지 않았다.

정말 필요로 하는 것은 명확한 설명과 이를 뒷받침해주는 그림들이다. 그래야 설명과 그림을 매치시켜가면서 단계를 이해할 수 있다. 아무리 알고리즘을 구현한 코드를 들이민다고 한들 머릿속에 그려내지 못하면 그건 이해했다고 할 수 없다. 매번 봐왔지만 아주아주아주 만족스러운 건 보지 못했다. 그런데 이 책은 어느 정도 내 요구사항을 만족시켜줬다. 비록 간간히 그림 속에 오타가 있어서 내가 잘못 이해한 건지, 그림이 잘못된 건지 확인하느라 끙끙댄 것만 뺀다면.

파이썬의 기초를 설명하면서 초급 과정에 나오지 않았던 내용들을 이해하는 데 좀 힘들었다. 언제나처럼 코드만 바라봐선 이해하기 힘들다. 결국 타이핑을 하든지 예제 코드를 받아서 돌려보든지, 실제로 돌려봐야 감이 오게 마련이다. 약간 안타까운 건, 이건 뭐지? 하는 코드도 조금은 들어 있었다는 거. 내가 이해를 못한 건지, 코드에 버그가 있었던 건지는 모르겠다. 많은 시간을 투자해서 다 검토해보진 못했으니까.

그래도 많은 부분은 파이썬에 대한 내 지식의 틀을 잡는 데 도움이 됐다.

이제 핵심 자료구조. 오, 이건 이렇습니다, 로 끝나지 않았다. 최소한 이게 왜 필요한지 개연성을 가지고 꼬리에 꼬리를 물면서 전개한다. 왜 이런 걸 만들어냈는지 소소하게라도 언급해서 좋다.

기본 알고리즘으로 알려주는 것들. 정렬, 그래프, 문자열 검색. 업무 특성 상 그래프는 제외하더라도 정렬과 문자열 검색은 정말 토 나올 정도로 자주 쓴다. 그러니 익히는 건 당연하다.

자, 문제들. 이게 문제다. 너무 많다. 단기간에 하기에는 매우 벅차다. 그래서 목표를 세워야겠다. 일주일에 2, 3개 정도 시도해보기. 전적으로 시간을 할애할 순 없으니, 차근차근 접근해야겠다. 그래도 맛보기 정도는 접근해봐야하니, 제일 처음으로 만나는 재귀를 봤다.

그렇다. 왜 재귀인가? 재귀하면 사람의 사고방식에 근접한 대신, 시스템 관점에서는 자원을 많이 써서, 잘못하면 스택 오버플로를 발생시킨다는 그 내용이 제일 먼저 떠오른다. 그래서 가급적 풀어서 구현하느라 애먹었던 게 한 두 번이 아니다. 요즘은 컴파일러들 성능이 좋아서 재귀적으로 작성해도 풀어서 성능을 최적화한다고 들었다. 그래서 뭐, 왠만하면 읽기 좋게 작성하는 게, 후임 개발자들한테도 도움이 될지 모르겠다.

앞서 말했던 메모리 이슈를 여기서도 빼먹지 않고 설명한다. 역시 기본에 충실하다. 코드 예제도 보여주면서 동시에 그림도 있다. 친절히 전개 순서도 알려준다. 이런 건 너무 좋다. 눈으로 차분히 따라가보면 조금씩 머릿속에 자리를 잡아간다, 그 개념들이.

이제 첫 번째 문제를 만났다. 홍수 채우기? 어떤 문제인지 설명하고 그 문제를 풀기 위한 의사코드를 제공한다. psuedo code를 의사코드로 변역했다. 뭐 원 발음대로 쓰기도 하고 유사코드라고도 하고, 아주 다양하게 불린다. 아무튼 이걸로 틀을 잡아줬다. 처음엔 이게 뭔가 싶지만, 나중에 계속 반복하다보면, 머릿속에 보통 이런 식으로 틀이 잡히더라. 그러니 익숙해지는 게 좋다.

해결코드를 보여주고 그로 인해 전개되는 걸 역시나 그림으로 설명해준다. 이런 게 너무 좋다. 답으로 코드만 보여주고 돌려보라는 무책임한 말은 안 한다.

좋다, 이런 식으로 반복해 문제들을 풀어가보면 잘 모르던 것들도 틀이 잡힐 것 같다.

주변에 새로 구직을 하는 분들을 가끔 보는데, 요즘은 코딩 테스트 기본으로 알고리즘 풀이를 한다고 한다. 그렇다면 어떤 책이든 알고리즘 풀이 연습도 하고 개념도 익혀야 할 텐데, 이 정도의 친절함이라면, 그리고 대세 언어 중 하나인 파이썬이라면 많은 도움이 될 듯도 하다.

간만에 맘에 드는 알고리즘 책을 찾았다. 아까 언급했다시피 오탈자 만날 때마다 검증 후 신고해야겠다. 살짝 봤는데 2건 신고됐더라. 내가 아직 제대로 파악 못한 부분들 같은데, 한 번 쭉 따라가봐야겠다.

“한빛미디어 <나는 리뷰어다> 활동을 위해서 책을 제공 받아 작성된 서평입니다.”