본문 바로가기
책 이야기/프로그래밍

고전 컴퓨터 알고리즘 인 파이썬 (Classic Computer Science Problems in Python) - 데이비드 코펙 저/최길우 역

by meticulousdev 2022. 2. 1.
반응형

1. 들어가며

    책 이야기를 하기에 앞서서 제 이야기를 잠시 해보려고 합니다. 저는 프로그래밍 비전공자입니다. 공학 분야에 있기는 하지만 프로그래밍을 취미 삼아 공부하는 그저 그런 사람입니다. 대학 필수 전공으로 들었던 프로그래밍 관련 수업에서 당당하게 D를 받고 충격으로 인해서 휴학했습니다. 그러다가 C언어를 공부하고 자료구조를 공부하고 프로그래밍의 매력에 빠져들었습니다. 그렇게 지금은 내 취미는 프로그래밍이요!라고 말하는 사람이 되었습니다.
    처음 이 책을 접하게 된 배경은 제가 활동하는 MATLAB 오픈 카톡방에서 알고리즘 스터디를 진행하면서 였습니다. 파이썬을 꼭 배워보고 싶기도 했고 MATLAB을 주된 프로그래밍 언어로 사용하고 있는 상황에서 요즘의 트렌드에 맞는 프로그래밍 언어를 하나 정도 더 배워봐야겠다는 게 당시의 생각이었습니다. 그리고 이 책은 파이썬을 나의 주된 프로그래밍 언어로 만들어주는 역할을 했으며, 이후 연속해서 읽게 된 다른 프로그래밍과 관련된 책들을 선정하는데 큰 도움이 되었습니다. 그래서 이 글을 읽고 있는 독자에게도 말하고 싶습니다. 파이썬 프로그래밍을 시작하고 아직 이 책을 읽지 않으셨나요? 그렇다면 지금 당장 읽기 시작하세요! 몇권 안되긴 하지만 그동안 읽은 프로그래밍 책 중에서 한권만 추천할 수 있다면 저는 이 책을 추천하겠습니다.


2. in Python

    책의 저자는 파이썬에 대해서 정말 잘 이해하고 어떻게 사용하는 게 좋은지 너무나도 잘 알고 있습니다. 그리고 이 점을 독자가 알기 쉽게 설명해주는 것이 이 책의 가장 큰 장점입니다. 예를 들어, 몇 권 안 되는 파이썬 프로그래밍 책을 읽었지만 이 책만큼 타입 힌트 (type hint)를 철저하게 지키면서 코딩을 하는 책은 아직 못 봤습니다. 타입 힌트는 파이썬 버전 3.5에서 도입된 것이기 때문에 다양한 버전이 존재하는 파이썬에서 이를 일반화하고 모든 책에서 사용하기에는 한계가 있을 수도 있습니다. 하지만, 파이썬으로 프로그래밍을 한다면 타입 힌트는 중요하게 다뤄야만 합니다. 타입 힌트에 대한 설명을 위해서 저자는 따로 부록을 만들어 타입 힌트를 소개하고, 이에 대한 장점과 단점을 알려줍니다.

 

타입 힌트는 파이썬에서 예상되는 타입의 변수, 함수의 매개변수 및 반환 타입에 어노테이션을 다는 것이다.
- 고전 컴퓨터 알고리즘 인 파이썬; 데이비드 코펙 저, 최길우 역; 한빛미디어, (2019); 부록 C 타입 힌트 간단한 소개


누군가에게는 익숙할 것이고 누군가에게는 어색할 수도 있는 것입니다. 타입 힌트의 가장 큰 장점은 프로그램의 가독성을 높인 다는 것입니다. 책에서는 타입 힌트 이외에도 컴프리헨션(comprehension), 제너레이터(generator), 제너릭(generic), 매직 메서드(magic method) 등 파이썬 프로그래밍을 더 파이써닉하게 할 수 있는 방법을 알려줍니다.


3. 고전 컴퓨터 알고리즘은 고전인가요?

    고전 컴퓨터 알고리즘이란 무엇일까요? 비전공자이기에 정말로 몰랐고 궁금했습니다. 딱히 검색해보지는 않았지만 책을 다 읽고 나니 고전 컴퓨터 알고리즘이란 컴퓨터 사이언스 분야에서 많은 연구자들에 의해 고민된 문제들을 해결하는 알고리즘일 거라고 결론 내렸습니다. 자 그럼 그런 알고리즘을 배우는 게 무슨 의미가 있을까요? 4차 산업혁명 시대에 머신러닝/딥러닝이 최고 아닌가요? 하지만 우리가 접하게 되는 많은 문제는 하나의 기술만으로 해결할 수 없습니다. 각각의 문제에 맞는 해결책이 존재하기에 고전 컴퓨터 알고리즘을 알고 있으면 써먹을 곳이 많습니다. 그리고 머신러닝/딥러닝은 최근에 갑자기 생겨난 기술이 아닙니다. 책에서는 고전 컴퓨터 알고리즘 중 요즘에도 많이 사용되는 유전 알고리즘, k-평균 군집화, 신경망 문제 등과 같은 머신러닝 기술들도 소개하고 있습니다. 아래는 k-평균 군집화 알고리즘의 일부입니다. 예시를 통해서 알 수 있듯이 알고리즘을 백지부터 어떻게 만들어야 할지를 알려줍니다.

(출처: 고전 컴퓨터 알고리즘 인 파이썬; 데이비드 코펙 저, 최길우 역; 한빛미디어, (2019); 6장 k-평균 군집화 혹은
저자 github - https://github.com/davecom/ClassicComputerScienceProblemsInPython.git)

 

class KMeans(Generic[Point]):
    @dataclass
    class Cluster:
        points: List[Point]
        centroid: DataPoint

    def __init__(self, k: int, points: List[Point]) -> None:
        if k < 1:
            raise ValueError("k must be >= 1")

        self._points: List[Point] = points
        self._zscore_normalize()
        self._clusters: List[KMeans.Cluster] = []
        for _ in range(k):
            rand_point: DataPoint = self._random_point()
            cluster: KMeans.Cluster = KMeans.Cluster([], rand_point)
            self._clusters.append(cluster)

    @property
    def _centroids(self) -> List[DataPoint]:
        return [x.centroid for x in self._clusters]


추가적으로 위의 코드에서 사용되고 있는 멋진 코딩의 기술은 다음과 같습니다.
1. 타입 힌트
2. 제너릭
3. 매직 메서드
4. 접근 제어 (access control)
5. 리스트 컴프리헨션 (list comprehension) 등

 

4. 다양한 예제와 연습문제

    이 글을 다쓰고 난 후 2회 차로 책을 읽다 보니 예제와 연습문제에 대한 내용도 빠질 수 없다는 생각이 들었습니다. 고전 컴퓨터 알고리즘이라는 이름에 맞게 하노이 탑 문제와 파이 계산하기 같은 누구나 한번쯤은 접해봤을 법한 문제들을 다룹니다. 하지만 여기서 끝이 아닙니다. 다음은 책에 등장하는 연습문제들 중 개인적으로 좋아하는 문제들입니다. 일부 문제는 아직 해결법을 찾지 못해서 2회 차로 책을 읽고 있습니다. 정말 도전 욕구를 자극할만한 문제들 아닌가요?

 

- 이미지 암호화

- 스도쿠 풀이 알고리즘

- 괴니히스베르크 다리 건너기 문제

- 인공지능 체스 등

 

5. 사소하지만 사소하지 않은 것

    리뷰의 끝은 오타에 대한 이야기를 해보려고 합니다. 이 책은 정말 오타가 적습니다. 이게 왜 중요한지 질문할 수도 있습니다. 그냥 인문학 서적이면 큰 의미가 없겠지만 프로그래밍 책에서의 오타는 치명적입니다. 오타로 인해서 분명 책에 있는 그대로 코드를 작성했는데 오류가 발생하는 경우가 많습니다. 그로 인해서 시간을 쓰다 보면 정작 코드나 내용 이해는 뒷전이 되고 오류 해결에만 집중하게 됩니다. (최근에 읽었던 단단한 어떤 책은 오타가 너무나 많아서 내용 이해가 어려울 정도였습니다.) 오타는 누구나 할 수 있는 실수이며 사소한 것이지만 동시에 사소하지 않은 것이 됩니다. 그런 점에서 이 책은 참 잘 써졌다는 생각이 듭니다. 6개월가량의 시간을 들여서 책을 정독하며 찾은 오타는 총 4곳이 전부였습니다. 그리고 이런 오탈자 들은 책을 읽으면서 이해된 내용들 덕분에 자연스럽게 어디가 오타인지 알게 됩니다. 아 물론 번역이 조금 어색한 부분도 있긴 하지만 그런 부분은 원서를 찾아보면서 공부하면 해결됩니다.
(https://www.hanbit.co.kr/store/books/look.php?p_code=B2018898164 - 오탈자 보기)


6. 조금은 부족하고 어설프지만

    프로그래밍 책에 대한 리뷰를 어떻게 쓸까에 대해서 정말 많이 고민했습니다. 책을 읽는데 6개월이 걸렸고, 리뷰를 쓰겠다고 마음먹고 1년의 시간이 흘렀습니다. 막상 다 쓰고 보니 처음에 리뷰를 쓰겠다고 마음먹고 계획했던 거에 비해서 책을 인용한 내용도 코드 설명도 부족하다는 생각이 듭니다. 하지만 이 리뷰를 읽고 있는 누군가에게 공부할 책을 선정하는데 도움이 되고 이 책을 읽은 사람들이 많은 것을 얻어 갈 수 있으면 좋겠습니다.

긴 글 읽어주셔서 감사합니다.
글과 관련된 의견은 언제든지 환영입니다.
반응형

댓글