처음 알고리즘을 입문하시는 분들에게, 헬로 코딩 그림으로 개념을 이해하는 알고리즘 리뷰
created: 2017.05.14
유튜브에서 Hungarian Dance Algorithm 이라고 검색하면 재밌는 동영상이 나온다. 나란히 선 사람들이 헝가리 전통 음악에 맞춰 춤을 추는데, 정렬 알고리즘에 따라 자리를 서로 옮겨간다. 사람들이 이런 시도를 하는 것도 흥미롭지만 얼마나 어려우면 춤으로 가르치려는 생각을 했을까 하는 생각도 든다. 저자 역시 알고리즘을 이해하는데 어려움을 겪었고, 그림을 통해 알고리즘을 설명하는 포스팅을 시작했고, 그것이 이 책이 나오는 계기가 되었다고 한다. 여러 사람이 그러한 것처럼, 나도 이 책을 정말 재미있게 읽었다. 후반부의 어려운 부분은 역시 어렵긴 했지만, 역자의 말처럼 나도 이 책만큼 알고리즘을 재미있게 설명하는 책은 읽어보지 못한 것 같다.
나는 C언어로 자료구조, 알고리즘을 배웠는데 수업 자체와는 별개로 코드의 가독성이 좋지 않아 로직을 이해하는 데에 시간이 더 들었다. 반면에 파이썬으로 구현한 코드를 보면 언어적인 복잡성이 적고 코드가 명료해서 알고리즘 자체에 집중하기에 더 유리하다. 예전에 나온 책 시리즈의 이름처럼 소설처럼 코드가 읽힌다고 느꼈다. 게다가 이해하기 쉽게 그림까지 곁들이니 책을 굉장히 빨리 볼 수 있었다. 책에서 사용하는 자료구조에 대한 설명도 추가적으로 들어가 있으니 알고리즘을 배우고 싶은 누구나 이 책으로 시작할 수 있을 것 같다.
책 곳곳에 좋은 질문/답변이 들어가 있다. 이런 문제들을 그냥 지나치지말고 곰곰히 생각해보면 본인이 얼마나 이해했는지 알 수 있고 또 더 잘 이해할 수 있으니 꼭 풀어보도록 하자. 챕터 마지막에 있는 문제들도 같은 이유로 꼭 풀어봐야 한다. 문제가 그렇게 어렵지 않고 앞에서 배운 내용을 확인하는 정도이니 너무 부담스러워하지 않아도 된다.
동적 프로그래밍같은 어려운 내용은 솔직히 그림으로 봐도 어렵긴 했다. 또 최장 공통 부분 문자열의 경우, 예제코드(자바, 파이썬은 완전한 프로그램이 아님)와 설명의 격자 채움이 달라서 사람들이 헷갈릴 것 같았다. 그래도 동적 프로그래밍을 응용할 수 있는 예제들을 제공하고, 연습문제를 풀어보면서 감을 익힐 수 있었다.
저자의 웹사이트를 가보면, 하스켈 및 함수형 프로그래밍의 요소에 대해 설명하는 포스팅을 볼 수 있다. 역시 책에서도 하스켈로 함수형 프로그래밍에 대해서 설명하고 있다. 자바8, C++, Python이 함수형 프로그래밍을 도입하고 스칼라같은 언어가 알려지는 것을 보니 함수형 패러다임이 부상하는 것을 알 수 있다. 나도 스칼라를 사용하면서 느낀 점인데 함수형 언어를 사용하면 코드의 가독성이 더 좋아진다. 그리고 코드가 기존에 비해 짧아져 생산성이 높아지니 한번 살펴봤으면 좋겠다. 해당 페이지의 코드를 자바로 짜면 다음과 같다.
import java.util.List;
import java.util.Optional;
public class SumFunc {
// Functional programming
public Optional<Integer> sum(List<Integer> numbers) {
return numbers.stream().reduce((a,b) -> a+b);
}
}
reduce() 함수가 두 원소를 더하는 함수를 이용해 최종적으로 리스트의 모든 원소를 더한 하나의 정수값을 리턴하게 된다.
깃허브에 들어갔을 때 예제를 여러 언어별로 다 제공하는 줄 알고 대단하다고 생각했는데, 그게 아니라 독자가 참여하여 예제를 커밋할 수 있도록 해둔 것이었다. 얕게나마 오픈소스에 기여하는 경험을 해볼 수 있고, 다른 독자에게 도움이 될 수 있으니 좋은 것 같다. 현재 동적 프로그래밍의 파이썬 예제가 아직 불완전하니 우리들 중 하나가 커밋할 수 있지 않을까?
책에서 조금 아쉬운 점은, KNN에 한 챕터를 할애해 설명을 하면서 예제 코드가 하나도 없었던 점이다. 클러스터링 예제 정도는 실을 수 있을 것 같았다. 그래도 연습문제에서 정규화문제나 샘플수를 설정하는 보편적인 방법을 설명하고 있어서 어플리케이션을 만들 때 참고할 수 있을 것 같다.
정리하면, 알고리즘에 거부감을 가진 사람들이나, 처음 접하는 사람에게 굉장히 좋을 입문서라는 것이다. 오늘 바로 시작하시길!