비전공자로서 기초도 바탕도 없지만 일단 부딪혀보자는 생각으로 백준 알고리즘을 하나씩 풀어보고 있었습니다. 그러나 얼마 안가 한계가 왔습니다. 더 이상 혼자 진도를 나가기가 힘겨워져 아무래도 알고리즘을 ‘공부’해봐야겠다는 생각에 이 책을 구매했습니다. 그리고 약 3개월이 넘어서야 겨우 1회독을 했습니다.
알고리즘
책에서 정의한 알고리즘은 다음과 같습니다.
어떤 문제를 해결하기 위한 절차로, 명확하게 정의되고 순서가 있는 유한 개의 규칙으로 이루어진 집합
프로그래밍 상황에서 어떤 문제가 주어졌을 때, 저희는 이를 해결하기 위한 절차를 세워야 합니다. 알고리즘을 공부한 사람이라면 그 절차를 더욱 간결하게, 빠르게, 그리고 아름답게 다듬을 줄 알아야 할 것입니다. 책에서는 평범한 알고리즘을 먼저 보여주고 그것을 아름답게 가공해나가는 과정을 보여줍니다. 여기에서 복잡도(complexity)라는 개념이 등장합니다. 복잡도는 다음의 두 가지 요소를 가지고 있습니다.
- 시간 복잡도(time complexity) : 실행에 필요한 시간을 평가한 것
- 공간 복잡도(space complexity) : 기억 영역과 파일 공간이 얼마나 필요한가를 평가한 것
백준 알고리즘 문제에서는 제출한 코드의 실행시간을 측정하고, 답이 맞았다고 해도 정해놓은 시간을 초과했을 시 틀렸다고 합니다. 이 때 저희는 만들어놓은 알고리즘의 시간복잡도를 고려하여 수정해야 할 것입니다. 책에서는 시간 복잡도를 고려하여 알고리즘을 개선하는 과정을 보여줍니다.
자료구조 파트에서도 어딘가 불편하거나 허점이 있는 알고리즘을 여러차례 개선해나가는 과정을 보여줍니다. 스스로 쥐어짜낼때는 잘 모르지만, 이렇게 점점 아름다워지는 알고리즘을 보다보면 어쩐지 카타르시스가 느껴지고는 합니다.
책의 후반부에서 나온 if문이 없이 for문만으로 이루어지는 ‘매우 아름다운 알고리즘’입니다. 회사에서 정신없이 코딩을 하다 보면 어쩔 수 없이 많아지는 if문 안의 else if문, 또 그 안의 조건문에도 길게 늘어지는 || 와 &&가 있을 때 왠지 모를 거부감이 느껴졌는데, 아름답지 못한 코드에 대한 본능적인 반응이었나 봅니다.
코딩테스트를 준비하기 위한 마음으로 읽기 시작한 책이지만, 잘 쓰여진 알고리즘을 읽고 이해하고 개선시켜나가는 재미를 느낄 수 있었습니다. 한번 읽고 마는게 아니라 여러번 읽고 이해하고 따라하면서 습득해야 이득을 볼 책인 것 같습니다. 코딩테스트 뿐만 아니라 회사에서, 또는 개인프로젝트에서 배운것을 활용하며 아름다운 코드를 작성해 보고 싶습니다.