[리뷰] 게임으로 익히는 코딩 알고리즘



개요

본 리뷰는 한빛미디어 출판사 "게임으로 익히는 코딩 알고리즘"을 읽고 얻은 지식을 정리한 글입니다.

알고리즘으로 게임하는 세상이 올 줄이야…


신선하다. 세상이 빠르게 변하고 점점 좋아진다는 건 알았지만 게임으로 알고리즘을 배우는 책이 나오리라고는 생각하지 못한것이 사실이다. 게임이든, 책이든 수단이 뭣이 중요한가 생각이 들기도 했지만 내 안에서는 알고리즘은 왠지 수학과 친밀하고 교과서 같은 분위기에서 벗어나면 안된다는 일종의 프레임이 형성되어 있었던 것 같다.

책을 펼치자마자 코딩게임 공식 사이트로 바로 들어가 보았다. 링크를 클릭하면 구글 OAuth 덕분에 별도 회원가입 없이 로그인이 가능하다. 구글 계정 등으로 로그인한 후 아래 그림과 같은 화면을 볼 수 있다. 처음이라 복잡해 보이지만 단순히 비교문 if만 알면 쉽게 풀 수 있는 쉬운 문제이다. 빨간색 동그라미 부분의 코드를 작성한 후 PLAY ALL TESTCASES를 클릭하면 좌측 상단의 멋진 게임실행 화면을 볼 수 있다. 그 후 GOT IT 또는 SUBMIT 버튼을 누르면 결과가 제출하고 메인화면으로 이동하게 된다.
코딩게임접속화면

어떤가 꽤 참신하지 않은가? 너무 참신하여 혹시 게임 플랫폼 광고용으로 만든 책은 아닌건지, 혹은 첫인상은 매혹적으로 다가왔는데 실상 알고리즘 핵심은 텅텅 비어있는 껍데기에 불과한 책은 아닌지 의심이 되기 시작했다. 그러나 기우였다. 사실 지금까지 읽은 어떤 알고리즘 책 보다도 쉽게 설명하고, 가독성을 높이기 위한 시각화 처리가 잘 되어있으며, 실전에 필요한 케이스를 다룸으로써 집중력을 높여준다. 아래 그림에서 보듯 주요 알고리즘을 시각적으로 쉽게 설명해 준다. 알고리즘도1 알고리즘도2 알고리즘도3

Science에 가까운 흥미를 떨어뜨리는 요소는 실전에 필요한 만큼으로 간결하게 압축하여 설명하였고 대신 이해의 깊이가 필요한 것은 놓치지 않고 다루었다. 알고리즘의 핵심개념과 시간복잡도, 공간복잡도를 알기 쉽게 설명한 후 초보자를 위해 조건문, 반복문, 인코딩과 관련된 기본기를 탄탄하게 해주는 게임부터 시작한다.

이어 2차원 배열, 큐, 스택, 해시맵 등의 자료구조를 다루고 탐욕 알고리즘, 그래프, 탐색(너비우선, 깊이우선), 재귀, 트리 등 알고리즘에서 가장 중요한 개념도 다룬다. 심지어 다익스트라, 동적프로그래밍까지 다루며 화룡정점을 찍는다. 흥미뿐만 아니라 지식의 깊이도 놓치지 않으려는 노력이 돋보였다.

구성 측면에서도 학습 능률을 높이기 위한 장치로 더 생각해 봅시다 코너를 두었는데 이 부분의 구성이 가장 마음에 든다. 배운 것을 토대로 나아가야 할 방향을 제시하고 흥미를 유발시켜 준다. 10장의 폭탄의 위치를 찾는 게임의 경우 학부시절 혼자서 만들었던 게임 생각이 났는데 그렇게 고심해서 혼자 만들었던 과정에서 얻은 내공 덕에 지금 먹고 살 수 있다고 생각한다. 여러 Chapter를 거치면서 그런 유익한 시간이 된다면 독자들에게는 큰 보탬이 될 것이다.

내용의 깊이, 구성, 흥미, 참신함 뭐 하나 떨어지는 구석이 없어서 솔직히 단점을 잘 못찾았다. 잘 만들어진 책이라는 생각이 들었다.

개발인생 15년. 알고리즘이 중요하다고 느낄 때

사실 한국 IT개발 시장에서 알고리즘을 쓸 일이 흔치는 않다. 알고리즘은 보통 각 언어들에 Library 형태로 잘 구현이 되어 있으며 잘 구현된 예제를 보며 찍어내기를 얼마나 빨리 하느냐가 그동안 IT시장에서 바라는 인재상이었기 때문에 쓸 일이 많지 않았다. 정말 슬픈현실이다.지금도 크게 다르진 않으나 AI, 딥러닝 분야를 필두로 뭔가 변화가 보이기 시작했다. 보다 수학, 통계학에 가까운 Science를 다룰 줄 아는 인재가 필요해지고 있다.

  • 알고리즘이 뭔데?
    간단히 말해서 문제를 해결하기 위한 (가급적 최선의 방법을 찾는)절차라고 할 수 있다.

  • 그런데 그게 왜 중요한데?
    문제 자체도 해결할 수 있고 시간복잡도, 공간복잡도 등을 예상하여 자원 사용을 효율화하고 연산 속도를 높이는데 큰 도움을 준다.

  • 어차피 컴퓨터로 돌리면 빠른거 아냐?
    이해를 돕기위해 간단한 예시를 들어보겠다. 이 책의 11장에서 다루는 외판원 문제를 생각해보자.

    외판원 문제? (출처 - 위키백과)
    여러 도시들이 있고 한 도시에서 다른 도시로 이동하는 비용이 모두 주어졌을 때, 모든 도시들을 단 한 번만 방문하고 원래 시작점으로 돌아오는 최소 비용의 이동 순서를 구하는 것이다. 그래프 이론의 용어로 엄밀하게 정의한다면, “각 변에 가중치가 주어진 완전 그래프(weighted complete graph)에서 가장 작은 가중치를 가지는 해밀턴 순환을 구하라”라고 표현할 수 있다.

    • 도시가 2개라면, A->B, B->A [2개]
    • 도시가 3개라면, A->B->C, A->C->B, B->A->C, B->C->A, C->A->B, C->B->A [6개]
    • 도시가 10개라면, [3,628,800개]의 경우의 수가 나온다.

    핵심은 도시가 n개라면 이동 가능한 경로의 수는 n!이 된다는 것이다. 시간 복잡도가 O(n!)가 되는 것이다. A라는 컴퓨터에서 위 알고리즘을 수행하는 데 걸리는 시간 O(1)을 무난하게 1초라고 가정하자.

    그리고 우주의 나이를 계산해보자. 지금까지의 관측한 결과를 바탕으로 ΛCDM 모형을 적용하면 우주의 나이는 약 137.98 ± 0.37억 년으로 추정된다. 비교를 위해 단위를 위에서 가정한 단위로 변경해보자.

    1년 = 365일 = 365 * 24시간 = 8,760시간 = 8,760 * 60분
    = 525,600분 = 525,600 * 60초 = 31,536,000초

    이므로,

    우주의 나이 = \(1.3798 * 10^{10} * 3.1536 * 10^7\) = 약 \(4.35 * 10^{17}\)초

    가 나온다.

    1. \[O(n!) > O(2^n)\]
    2. \[2^{10} = 1024 = 10^3\]

    두가지 상황을 어림잡아 17 × 10 /3 = 약 57. 위의 가정하에 대략 57개의 도시만 있으면 A컴퓨터로 우주의 나이 만큼 연산을 수행해야 결과를 구할 수 있다는 의미가 된다. (예시를 위해 대략적으로 계산하며 생긴 오차가 있을 수 있으니 양해 부탁드린다.)

  • 그리고 언제 또 쓰이는데?
    • 구글 검색 서비스가 2초 이상 걸린다면 고객이 구글을 사용할까? 구글의 가장 큰 자료는 피처수가 10억개에 육박하는 것도 있다. 아무리 서버 컴퓨팅 파워가 버텨준다 쳐도 조금이라도 빠르게 검색 알고리즘을 개발해야 하지 않을까?
    • 모바일에서 딥러닝을 작동시키려면 한정된 자원을 최대한 활용할 수 있어야 한다.
    • 딥러닝의 연산량도 마이크로 Sec 차이가 최종 성능에는 엄청난 영향을 미친다.
    • 일반적인 App도 자원을 얼마냐 쓰느냐가 배터리 소모에 직결된다.
    • 구글이 온도 1도씨라도 줄이기 위해 IDC센터를 폭포 옆으로 이전한 이야기를 들은적이 있는가? 알고리즘이 발열량에도 영향을 미친다.

그 뿐만이 아니다. 알고리즘을 사칙연산처럼 쉽게 쓰는 것은 어렵다. 상황에 따라 다르게 쓰일 수 있기 때문이다. 그 개념에 한바탕 푹 빠져든 채로 살아야 숨쉬듯이 자연스럽게 몸에 베는 것이다. 단순히 알고리즘 지식만 얻는 것도 아니다. 자연스레 프로그래밍 스킬도 얻게 되고 사고의 속도에 박차를 가할 수 있는 된다. 그럼에도 알고리즘 공부를 하지 않을 것인가?

누가 읽어야 하는가?


  • 초보 프로그래머, 컴퓨터 전공 학부 초년생

  • 경력은 많아도 찍어내기 신공에만 탁월한 응용력이 부족한 현직 개발자

  • 기타 프로그래밍에 관심이 있으신 분
    데이터 분석, 경제학 등 프로그래밍을 알면 큰 시너지 성과를 얻을 수 있는 타 학문 전공자에게도 알고리즘 개념의 기초를 다지기에 정말 도움이 되는 책이다.

책의 구성 및 요약


이 책은 크게 세 부분으로 구성되며, 각 장에서 다루는 내용을 요약해 보았다.

  • 1. 알고리즘을 위한 최소한의 기초지식(1 ~ 5장)
    • 알고리즘의 핵심 개념과 시간복잡도, 공간복잡도 개념 파악
    • 조건문, 반복문, 인코딩 등 기본기 전수
    • 코딩게임에서 노는 방법
    • 그 외 프로그래밍 기본 문법과 데이터 타입에 익숙해질 수 있다.
  • 2. 핵심 자료구조와 알고리즘(6 ~ 13장)
    • 배열, 큐, 스택, 해시맵 등의 자료구조
    • 탐욕 알고리즘, 그래프, 탐색(너비우선, 깊이우선), 재귀, 트리 등 알고리즘
    • 실전에서 알고리즘을 활용하게 되었을 때 대처하는 자세
  • 3. 고급 알고리즘(14장 ~ 15장, 부록)
    • 다익스트라, 원형큐, 동적프로그래밍 등 고급 알고리즘
    • 취업한 선배들이 알려주는 Tip 및 수도코드 제시

요약하며…


예전과는 달리 알고리즘을 그림으로도 공부하고 심지어 게임으로도 공부할 수 있는 멋진 세상이 왔다. 딥러닝 등의 열풍으로 우리나라에서도 찍어내기식 개발자 양산에서 Science에 튼튼한 프로그래머를 요구하는 문화도 다가오고 있다. 한 10년 만 늦게 태어났더라면 얼마나 좋았을까 그런 생각도 해본다.

위에서 언급한 바와 같이 알고리즘은 컴퓨터 공학의 핵심이자 정수이다. 중요성은 두말할 나위 없고 어떻게 깊이있게 빨리 익히는가가 관건이라 할 수 있는데 시중에 나와있는 어떤 책보다 알고리즘에 흥미롭고 빠르게 적응할 수 있을 것이라 생각한다. 큰 틀만 잡으면 이젠 깊이있는 교과서, 참고서도 두렵지 않을 것이다. 뭐든지 알면 개뿔도 아닌데, 모르면 그렇게 무서울 수가 없다. 이 책으로 알고리즘을 개뿔처럼 보실 수 있게 되시길 바란다.

<한빛미디어 출판사>

믿고보는 “한빛미디어 출판사”. IT분야에서 독보적인 양질의 도서를 출판하는 회사입니다. “나는 프로그래머다” 팟캐스트 후원, DevGround2019 행사, 리뷰어 모집, 다양한 학습 지원 등 다양한 분야에서 사회에 공헌하는 개발자와 공생하는 업체입니다. IT분야에 관심있으시다면 한빛미디어의 책으로 후회없는 출발을 하실 수 있습니다.

한빛미디어 바로가기




© 2019.04. by theorydb

Powered by theorydb