자료구조, 알고리즘 그리고 코딩 테스트와 관련된 추천 책(교재)

자료구조, 알고리즘 그리고 코딩 테스트와 관련된 추천 책(교재)
Photo by Markus Winkler / Unsplash

요약 : 코딩 테스트와 알고리즘(자료구조 포함)공부는 목적이 전혀 다르기 때문에 학습하는 방법이 뚜렷한 차이를 보입니다. 그래서 목적에 맞춰서 책을 구매하고, 학습을 진행해야 합니다. 목적에 맞는 책를 선별하고, 안 볼 책이거나 못 볼 책은 구매를 하지 않기를 권장합니다. 가능하다면 문제풀이 중심의 책 중에서 자신에게 맞는 것을 먼저 보는 것을 권장합니다. 알고리즘의 경우 구현이 없는 책은 가능하면 피하도록 하세요. 자료구조는 특별한 사항이 아니라면 권하지 않습니다.

자료구조와 알고리즘은 왜 배우는가?

" 사놓고 언제가 본다는 환상은 버리자. 그 돈으로 MG 건프라를 하나 더 사자. " - sd

"자료구조(자구)와 알고리즘(알고)"은 프로그래밍을 사용해서 문제를 해결하기 위한 기초적인 구조와 접근방법입니다. 문제해결능력을 향상시키기 위한 기초적인 접근 방법으로 알려져 있습니다.

기업이나 조직에서 프로그래밍을 사용한 문제해결 능력을 검증하기 위한 기초적인 방법으로 코딩 테스트 혹은 문제풀이 방식을 사용하고 있습니다. 자료구조와 알고리즘을 학습하는 것은 문제해결 능력을 향상시키기 위한 방법으로 자료구조를 사용해서 문제 해결에 필요한 데이터 구조를 결정하고, 알고리즘을 활용하여 데이터 구조를 기반으로 주어진 테스트나 문제를 해결합니다. 이상적으론 그렇습니다.

4년제 대학교를 기준으로 CS 및 컴퓨터 공학, 이와 관련된 학과의 경우 일반적으로 2학년이 되면 "자료구조(자구)와 알고리즘(알고)"을 수강합니다. 1학기에 자료구조, 2학기에 알고리즘을 수업하거나, 3학기에 걸쳐서 자료구조와 알고리즘을 수업합니다. 학과의 지향점이 CS 및 컴퓨터 공학의 기초적인 부분을 중요하게 여기는 학교라면 2학기 동안 자료구조와 알고리즘을 수업하고, 1학기 동안 실습 및 실험을 진행합니다. 만약 이 글을 읽는 여러분의 학교가 "자료구조와 알고리즘"을 3학기 이상 수강하도록 커리큘럼이 구성되어 있다면 좋은 교육환경에서 학습하고 있습니다.

"자구와 알고"는 학습에 필요한 시간이 길고, 별도의 연습 및 수련 과정을 동반하기 때문에 학습 비용이 굉장히 높은 과목입니다. 프로그래밍 언어를 포함하면 2과목을 무려 4학기에 걸쳐서 학습하게 됩니다. 이것을 올바로 이해하고 적용하기 위해선 연관된 CS 관련 지식도 병행해서 배워야 합니다. 이 모든 것을 유기적으로 적용할 수 있도록 학습해야 합니다. 그래서 "자구와 알고"는 학습 비용이 굉장히 높습니다. 시간과 비용을 고려했을 때, 적당한 시점에 올바로 공부해두지 않으면 평생을 걸쳐서 넘어야 할 산이 됩니다. 시간을 들여서 넘을 수 있다면 다행이지만 특정 시점을 놓치면 생각보다 높은 산맥이 됩니다.

하필 지금해야 하는가?

CS 전공자의 경우 대학교 4년을 통털어서 자료구조, 알고리즘, 컴퓨터 구조, 컴파일러, 네트워크, 운영체제는 실무 환경에서 배울 수 있는 지식이 아닙니다. 기존 지식을 활용하는 것은 별다른 문제가 아니지만, 기초지식은 실무에서 학습하기 쉽지 않습니다. 따라서 시간이 허락하고, 비용을 감당할 수 있을 때 충실하게 공부해야 한다.

이 글을 이 모든 과정을 조금이나만 효율적으로 학습할 수 있도록, 작은 도움이 되었으면 하는 바람으로 작성되었습니다. 많은 개발자들이 자신의 소중한 시간을 절약하고, 적절한 책를 통해서 필요한 기술을 빠르게 성취할 수 있기를 희망합니다.

본격, 내 맘대로 서평 열전(2023 업데이트)

이렇게 중요한 과목이다 보니 많은 사람들이 "자구와 알고"에 관한 책을 검색하고 구매합니다. 많은 사람들이 자구와 알고의 타는 목마름을 해소하기 위해서 신 새벽 뒷골목 어딘가에서 검색에 열중합니다. 웹 ChatGTP, 인터넷, 구글에 "자료구조 알고리즘 추천 책"를 검색하면 많은 책들이 쏟아져 나옵니다. 저도 이 대열에 합류하고자 합니다. 차이점이 있다면 저는 대학교에서 수업에 적용하였거나, 제가 읽었거나 혹은 개발 스터디에 활용했던 책을 위주로 소개합니다.

아래 목록은 2023년 10월 1일 기준으로 자료구조, 알고리즘, 코딩 테스트에 관련된 책으로 구성되어 있습니다.

자료구조

  • [DS1] , C로 쓴 자료구조론, Horowitz(지은이)/이석호(옮긴이) 1993., C++ 자료구조론, Ellis Horowitz(지은이)/이석호(옮긴이) 2007.

    • 필수적인 자료구조에 대한 내용이 학술적으로 잘 정리되어 있습니다. 예를 들어 $Big-O$ 표기를 증명하거나 하는 것들이 포함되어 있어서, 전공생에게 적합한 책입니다.
    • 예제 코드가 조각 코드로 주어지고, 코드 작성 기법이나 문법 등이 현재 환경과 어울리지 않는 점이 있어서 현재 시점에서 이 책을 구매해서 학습하는 것은 추천하지 않습니다. 학술적인 관점에서 자료구조를 설명하는 방법이 궁금하거나 관련 연구자라면 참고해보면 좋을 책입니다.
    • 개인적인 견해로는 <<C++ 자료구조론>> 보다는 <<C로 쓴 자료구조론>>의 내용이 단순하고 좋은 듯 하지만, <<C++ 자료구조론>>의 경우 트리와 그래프 부분의 변경사항이 많아서 지금 도서관에서 빌려보신다면 언어와 무관하게 <<C++ 자료구조론>>을 보시기 권장합니다.
  • [DS2] (절판) C로 구현한 알고리즘, Kyle Loudon, 2000.

    • 알고리즘 책이지만, 자료구조에 대한 설명히 좋습니다. C언어를 사용하고 있음을 전면에 내세우고 있기 때문에, 자료구조 설명시 포인트를 활용하는 방법을 잘 정리해두고 있습니다. C언어 초급[1]자에게 추천합니다.
    • 코드가 설명보다 더 길기 때문에 만에 하나, C언어의 이해도가 낮으면 조각 코드를 실행할 방법이 없습니다. 그리고 원서가 1999년, 국내 번역서가 2000년대라는 점에서 알 수 있듯이 현재(2023년)에 해당 코드를 기반으로 학습하는 것을 권장하지 않습니다. 하지만, C언어 초급자라면 포인터와 배열 등을 활용하는 방법을 엿볼 수 있습니다. 가능하면 도서관에서 빌려보세요.
  • [DS3] (절판) 열혈강의 자료구조, 이상진, 2010.

    • 추상 자료구조(abstract data type, ADT)가 포함되어 있고, 설명이 잘 되어있습니다. <<윤성우의 열혈 자료구조>>와 함께 자료구조 학습자들이 많이 선택했던 책 중 하나입니다. 쉽고, 자세하고, 작동하는 코드를 제공합니다.
    • 대부분의 자료구조를 자세히 설명하고 있어서, 분량이 조금 많습니다. 그리고 다양한 분야를 다루고 있어서, 초급자가 학습하기에 범위가 산만합니다.
    • 트리, 그래프에 해당하는 부분도 자세히 설명하고 있지만, 선형자료구조에 비해서 설명이 어렵습니다. 선형자료구조는 초급자가 읽어도 충분히 이해되는 수준이지만, 비선형자료구조는 설명이 쉽지 않기 때문에, 해당 책을 도서관에서 보신다면 선형자료구조에 대한 내용은 참고해보고, 비선형자료구조의 경우 다른 책를 참고하시는 걸 권장합니다.
    • 동일 저자의 <<자료구조 입문 - 알고리즘과 그림으로 이해하고 C로 구현하는>>을 추천합니다.
  • [DS4] 윤성우의 열혈 자료구조, 윤성우, 2012.

    • 앞선 <<열혈강의 자료구조>>와 장점은 동일합니다. 쉽고, 자세하고, 작동하는 코드를 제공합니다. 자료구조 내용 중 기초적인 것을 위주로 전달하고 있어서 혼자서 학습하기에 적당한 분량입니다.
    • 개인적으로 이 책을 많이 추천했습니다. 당시에 이 책과 견주어서 초급자가 자료구조에 대한 개념을 이해하고 코드 작성까지 무난하게 진행하는 책이 없었기 때문입니다. 현재는 다른 방식으로 자료구조를 학습하기 때문에 이제는 이 책을 추천하진 않습니다. 하지만 초급자가 보기엔 여전히 괜찮은 책입니다. 특히, C언어를 활용하신다면 여전히 좋은 책 입니다.
  • [DS5] 자료구조 입문 - 알고리즘과 그림으로 이해하고 C로 구현하는, 이상진, 2016.

    • <<열혈강의 자료구조>> 에서 핵심적인 부분을 선별하고 도표를 기반으로 설명을 보강한 책입니다. 기존의 책에서 핵심적인 부분을 선별했기 때문에 분량도 많이 줄였습니다.
    • 자료구조에 대한 설명 뿐만 아니라 코드에 대한 설명도 보강되었기 때문에 C언어로 자료구조 및 알고리즘을 학습한다면 좋은 선택이라 할 수 있습니다.
  • [DS6] 이것이 자료구조+알고리즘이다 with C 언어, 박상현, 2022.

    • 추상 자료형에 대한 소개 및 간단한 알고리즘까지 한번에 소개하는 책입니다. 자료구조에 많은 할애를 하고 있고, 알고리즘은 3가지 정도를 소개하고 있습니다.
    • 가장 최근에 출간된 책이고, 한빛미디어에서 오탈자 등 출간 이후에 꽤 신경을 쓰고 있어서, 현재 자료구조를 공부한다면 이 책으로 시작하는 것을 권합니다.

알고리즘(TODO)

  • [Algo1] 알고리즘, Rich Neapolitan (지은이), 2004.

  • [Algo2, TAOCP] The Art of Computer Programming 3, 2, 1, 4, 도널드 커누스, 2007-2013.

  • [Algo3, CLRS] Introduction to Algorithms 3rd, 토머스 코멘, 2014.

  • [Algo4] 알고리즘 개정4판, 로버트 세지윅, 2018.

    • 많은 사람들이 최고의 책으로 찬사를 보내는 <>와 <>는 실행 가능한 코드를 제공하지 않습니다. 로버트 세지윅의 <<알고리즘 개정4판>>은 실행 가능한 Java 코드를 제공하고 있습니다.
    • 앞선 Algo1~3은 금단의 열매입니다. 이 책을 보고 코드를 작성해서 책에서 제시한 '실험'을 진행할 수 있는 수준이라면 여러분에게 최고의 책입니다.
    • 코드를 작성하는 능력이 없거나, 책에서 제시한 "예제, 연습문제"를 해결할 능력이 없다면 이 책은 극독입니다. 흔한 말로, '독만든 독배'입니다.
    • CS를 전공하고 있다면, CLRS를 알고리즘 책으로 선정하고, 해당 책에서 설명하는 것 중에서 난해한 부분을 다른 책을 사용해서 보강하는 형태로 공부하는 것을 권합니다. 가능하면 연습문제를 50% 이상은 풀어보는 것을 목표로 잡아서 학습하면 좋은 성과가 있을 것입니다.
    • CLRS로 곧바로 진격하기 어렵다면 로버트 세지윅의 <<알고리즘 개정4판>>을 학습하는 것도 좋은 방법입니다.
    • TAOCP는 CS 연구자가 읽기에 좋습니다. 알고리즘에 대한 세부적인 이력이나 발전 과정을 찾아보기에 좋기 때문입니다. 연습문제나 예제는 눈으로 읽어보고 가능성 있는 문제는 체크해두었다가 천천히 풀어보길 권합니다. 이 책을 읽고 이해가 될 정도면 현재 내가 작성하는 글을 볼 일이 없을 것이고, 이 글을 보고 있다면 나처럼 평범한 개발자일 것으로 추측됩니다. TAOCP는 시간을 들여서 천천히 학습해야지 무턱대고 각잡고 학습하기엔 내용이 너무 방대하고 깊이가 깊으니, 주의해야 합니다.
  • [Algo5] 알고리즘이 보이는 그림책, ANK Co.,Ltd, 2015.

    • 이 책은 자료구조와 알고리즘을 도식화 시키는 방법을 연습하기 좋은 책입니다.자료구조나 알고리즘 초급자가 많이 본다고 알려졌으나 제가 생각하기엔 중급자 이상에게 추천합니다. 자료구조를 '그림'으로 그리는 방법을 엿볼 수 있으니 가능하면 이 책을 참고해보세요. 특히, 강의를 고민하고 계시다면 이 책을 꼭 참고하세요.
    • 자료구조 중에서 '선형자료'는 A4에 그림으로 그릴 수만 있으면 대부분의 코드 는 작성이 가능합니다. '자료구조'를 도식화 시키는 것은 생각보다 알고리즘을 쉽게 이해할 수 있습니다. 가격도 저렴하니 하나 사두고 따라 그려보면 도움이 됩니다.
  • [Algo6] C로 배우는 알고리즘 1,2, 이재규, 2013.

    • 책이 2권으로 분권되어 출간되어 있습니다. 그래서 분량이 제법 많습니다. 무엇보다 이 책은 C언어에 대한 높은 이해도를 요구합니다. 읽을 수만 있으면 C언어에 대한 수준을 한층 높여줄 것입니다.
    • 이 말을 뒤집으면 C에 대한 적응력이 없으면 난이도가 급상승하고 책을 읽을 수 없습니다. 책에 제시된 코드의 대부분은 실행이 안될 수 있습니다. 책에 나온 예제는 'Turbo-C 2.0'을 기준으로 설명하고 있기 때문에 아마 쉽지 않은 여정입니다.
    • 그럼에도 불구하고, 이 책을 이렇게 리스트에 포함시킨 이유는 C언어의 고급 기술이나 트릭을 굉장히 많이 배울 수 있기 때문입니다. 이 책은 C에 특화된 알고리즘 책입니다. 만약 이 책의 알고리즘을 직접 구현'할 수 있다면 책 그만 읽고 현업에 가서 문제를 해결해보세요.
  • [Algo7] 파이썬으로 배우는 실전 알고리즘, 마시모 디 피에르, 2015.

    • 일반적인 알고리즘 책의 특성을 전혀 반영하고 있지 않기 때문에, 필요한 부분만 읽기에 좋습니다. 알고리즘 책은 통상적으로 '탐욕(Greedy), 분할-정복(Divide and Conquer)' 등으로 구성되는데, 이 책은 앞 부분에 정통적인 알고리즘 기법을 소개하고 중반 이후에는 '수치', '확률', '난수' 등에 대해서 다룹니다.
    • 수학적 표기법을 알고리즘으로 표현하는 방법에 특화된 책입니다. 그리고 Python으로 알고리즘을 소개하고 있다는 점이 장점입니다.
  • [Algo8] 가장 쉬운 알고리즘 책, 미와 요시코, 2014.

    • 단호하게 말해서, 프로그래밍으로 문제해결을 위한 알고리즘 관련 책이 아닙니다.왜냐하면 이 책은 알고리즘에 관한 세부적인 사항을 정리해둔 것으로 '알고리즘'에 대한 책이 아니라 '알고리즘과 관련된 주제'를 다루고 있습니다.
    • 이런 책은 들고다니면서 시간날 때마다 조금씩 읽어두면 좋습니다. 책에서 소개하는 내용은 알고리즘을 이해하는데 주변지식으로 많이 활용되기 때문에 시간이 허락한다면 가볍게 꼭 일겅보세요. 이 책에서 다루는 주제가 이해가 안되다면 그냥 넘어가도 좋습니다. 알고리즘을 이해하는데 필수적인 내용은 아닙니다. 이런 주변 지식은 꾸준히 습득해 두시길 권합니다.
  • [Algo9] 고전 컴퓨터 알고리즘 인 파이썬, 데이비드 코펙, 2019.

    • Python으로 대표적인 알고리즘 기법을 학습할 수 있는 책입니다. 최근에 출간된 책으로 Python을 활용하여 알고리즘을 구성하는 방식을 학습할 수 있습니다.
    • Python을 사용한다면 이 책을 통해서 알고리즘 기법을 연습해보길 권합니다. 난이도가 높은 편은 아니지만, 생각보다 쉽지도 않습니다.

문제풀이

  • [Solve1] 알고리즘 문제 해결 전략, 구종만, 2012.

    • 알고리즘 문제 해결 전략은 프로그래밍 대회 문제를 소개하고 해설을 담은 책입니다. 문제 중심으로 이뤄져있기 때문에 자구 및 알고의 적응력을 높일 수 있습니다.
    • 이 책은 알고를 사용한 문제풀이에 특화된 책입니다. 알고리즘 문제 해결 전략은 책이 2권으로 구성되어 있는데, 1권부터 읽지 말고 2권부터 읽길 권합니다. 자료구조가 1권에서 소개되기 때문입니다.
    • 문제 중심으로 풀어나가기 때문에 다른 책에 비해서 이론적인 부분이 많이 생략되어 있습니다.
  • [Solve2] 문제로 풀어보는 알고리즘, 김용혁, 황인욱, 2012.

    • 책의 분량이 작기 때문에 문제의 양은 많지 않습니다. 이론적인 내용도 소박합니다.
    • 그럼에도 불구하고 이 책을 소개하는 이유는 이 책을 쓴 저자들이 생각보다 많은 '시행착오' 권장하고 있기 때문입니다.
    • 만약 적당히 재미있는 문제를 찾고 있다면 해당 책에서 '3장, 5장, 7장, 8장'을 권합니다. 이 책은 '시행착오'를 통한 깨달음을 추구하는 책입니다. 반면, 문제의 '장르'가 협소하기 때문에 다양한 문제를 풀어보고 싶다면 다른 책을 찾아보는 것을 권합니다.
  • [Solve3] 코딩의 수학적 기초를 다지는 알고리즘 퍼즐 68, 마스이 토시카츠, 2019., [Solve4] 잠자는 코딩 브레인을 깨우는 알고리즘 퍼즐 69, 마스이 토시카츠, 2019.

    • 다른 책에 비해서 상대적으로 난이도가 낮은 문제를 제시하고 있습니다. 문제풀이에 대한 경험이 전혀없거나, CS 전공이 아닌 경우에 이 책으로 시작하기를 권장합니다. 앞선 책에 비해서 문제가 쉽고, 문제 풀이를 코드로 변경하는 과정도 쉽게 설명되어 있습니다.
  • [Solve5] 쓰면서 익히는 알고리즘과 자료구조, 윤대석, 2021.

    • 문제풀이에 적합한 형태의 책이라기 보다는 빠르게 복습하기에 좋은 책입니다. 기초적인 CS 문제를 다루고 있기 때문에 CS 전공생이라면 빠르게 자신이 학습한 내용을 점검하기에 좋습니다.
    • 책에서 소개하는 풀이양식도 눈여겨 볼 만하며, 테스트 케이스에 대한 설명도 다루고 있기 때문에 시간을 내어서 읽어보길 권합니다.
  • [Solve6] 똑똑한 코드 작성을 위한 실전 알고리즘, 조지 하이네만, 2022.

    • 문제풀이에 자주 거론되는 문제를 Python을 사용해서 다루고 있습니다.
    • 기존에 다른 책을 보셨던 분들은 주요 알고리즘을 정리하는데 활용하기에 좋습니다.
  • [Solve7] 실전 대비 C 알고리즘 인터뷰, 헤먼 자인, 2020.

    • C언어를 사용해서 문제를 해결하는 방법을 설명합니다.
    • CS를 전공을 하셨거나, 다른 언어에 관심이 많으시면 이 책을 조금 다른 형태로 활용하시는 것을 추천합니다. 이 책은 C언어를 활용해서 문제를 해결하기 때문에 코드가 굉장히 로우(low)합니다. 장단점이 될 수 있는 특징이지만, 이 책을 활용하셔서 자신이 사용하는 언어와 비교해보시면 언어에 대한 이해도를 높일 수 있습니다.
  • [Solve8] 자바스크립트 자료구조와 알고리즘, 마이클 맥밀런, 2014.

    • 문제를 풀이하는 방법을 JavaScript를 활용하고 있기 때문에, JavaScript를 사용한다면 한번쯤 눈여겨 볼 만 합니다. 앞선 책 중에서 Solve3, Solve4도 병행해서 참고해보면 좋습니다.
  • [Solve9] 자바로 배우는 핵심 자료구조와 알고리즘, 앨런 B. 다우니, 2018., [Solve10] Do it! 알고리즘 코딩 테스트 : 자바 편, 김종관, 2022.

    • Java를 기반으로 문제풀이를 설명하는 책입니다. 백엔드 개발자에게 추천하며, 다른 교재와 유사한 문제를 다루고 있기 때문에 난이도는 크게 신경쓰지 않아도 될 듯 합니다.
  • [Solve11] 보통의 취준생을 위한 코딩 테스트 with 파이썬, 권국원, 2022., [Solve12] 코딩테스트로 시작하는 파이썬 프로그래밍, 다니엘 진가로, 2022., [Solve13] 파이썬 알고리즘 인터뷰, 박상길, 2020.,[Solve14] 한권으로 끝내는 코딩테스트, 윤성환, 2023.

    • Python을 기반으로 문제풀이를 설명하는 책입니다. 데이터분석 및 머신러닝 기반으로 테스트를 준비하는 분들에게 추천합니다.
  • [Solve15] 이것이 취업을 위한 코딩 테스트다 with 파이썬, 나동빈, 2020.,[Solve16] 코딩 인터뷰를 위한 알고리즘 치트시트, 푸둥라이, 2022.,

    • LeetCode나 프로그래머스의 예제를 활용하고 있습니다. 온라인 저지 사이트를 활용하는 분들에게 추천합니다.

어떤 책을 보는게 좋을까?

이 많은 책 중에서 어떤 것을 봐야 할까요? 저는 문제풀이 관련 책을 먼저 보기를 권합니다. 왜 그런지 계속 이야기를 이어나가 보겠습니다.

자료구조

자료구조는 CS 전공자가 아니라면 별도로 공부하는 것을 권장하지 않습니다. 그리고 공부를 하기로 마음을 먹었다면 ADT가 있는 책을 선행해서 읽어보세요.

코딩 테스트나 문제풀이를 기반으로 빠르게 개발을 진행하려고 하는 분들에게 자료구조와 관련된 내용은 권하지 않습니다. 현재 사용하고 계신 대부분의 언어는 자료구조를 기본적으로 제공하고 있기 때문에, 자료구조를 직접 구현하는 것은 좋은 선택이 아닙니다. 반면, CS 전공자의 경우 특정 알고리즘을 학습하면서 사용되는 자료구조를 직접적으로 구성하는 것을 추천합니다. 자료구조에 대한 이해도가 높고, 알고리즘에 적용하는 방법을 잘 활용할 수 있다면 코딩 테스트나 문제풀이 뿐만 아니라 다른 영역에서도 큰 도움이 될 것입니다.

그런데, 자료구조를 공부하면 왜 다른 영역에서 큰 도움이 될까요? 이 질문에 대한 답변은 ADT 입니다. ADT는 "추상 자료형"입니다. 듣는 즉시 이 단어가 얼마나 '난감한지' 대략적인 느낌이 옵니다. "추상"이란 단어 들어가서 쉽게 풀린 예가 없습니다. 추상 객체, 추상 클래스, 추상화 등, '추상'이란 접두/접미가 붙는 단어는 쉽지 않습니다(기분탓인가?). 거기다가 "자료형" 이란 단어가 결합되면 뭔가 클래스 같기도 하고, 아닌것 같기도 합니다. 흔히들 ADT는 '자구의 명세'라고 합니다. 자료구조가 구현해야 하는 기능에 대한 명세이기 때문에 당연히 구현에 대한 측면은 다루지 않습니다. 왜냐하면 ADT는 언어와 '독립적'이기 때문인데, 어느 언어를 사용하던 ADT에 표기된 기능만 작동하면 자료구조의 기본적인 역할에 문제가 없다는 뜻입니다. 즉, 조향기로 바퀴를 움직이는 물체를 차로 정의하면 벤츠도 차고, 티코도 차고, 자전거도 차가 됩니다.

자구 열심히 배워서 어디에 쓰나면 ADT를 가지고 프로그램 설계 및 구현에 사용할 수 있습니다. ADT를 알아야 배운 자구를 써먹을 수 있습니다. 이진 트리가 좋다라는 건 이론적으로 배우지만 구현에선 배열로 만드나 Linked List로 만드나 상관없습니다. '완전 이진 트리' ADT만 충족하면 됩니다. 그리고 ADT만 충족하면 해당 알고리즘과 코드를 조금이라도 재사용할 수 있습니다. 그리고 회사 업무에선 기본 자료구조가 아니라 '고객', '영업', '판매사' 등과 같은 형태의 굉장히 모호한 주체가 '자료구조'가 되고 해당 자료구조에 대한 연산을 구현하게 됩니다. 추상화된 형태의 자료구조를 구성하는 방법을 배웁니다. 그리고 특정 형태의 자료구조가 제공하는 연산에 대한 이해도를 높일 수 있습니다. 이런 이해도가 STL이나 Collection을 좀 더 유기적으로 사용할 수 있는 토대가 됩니다.

ADT에 대해서 조금 더 거칠게 첨언하자면, '자료구조에서 제공하는 연산의 목록'이라 간주해도 됩니다. 예를 들어서 '은행계좌'라는 자료구조를 사용한 ADT는 '입금, 출금, 대출, 공과급 납부, 신용카드 연동' 등과 같은 연산을 할 수 있는 'deposit, withdraw, loan, utilityBill, checkCard' 등의 함수목록를 지칭한다고 생각해도 무방합니다. 레포트, 기말고사, 실습 평가의 경우 아래와 같은 형태의 '함수 원형'만 나오는 경우가 있습니다. 함수 원형이라도 나오면 다행인데, 약간 난이도가 높은 문제는 해당 문제에서 'ADT'를 설계하고 구현하라고 하는 문제가 출제되기도 합니다. 여튼, ADT를 참고하라고 하는 문제를 많이 접하게 됩니다. 해당 목록이 ADT라고 할 수 있습니다. 해당 목록을 보고 Linked List 자료구조를 가지고 아래 제시된 연산(혹은 함수)를 구현하면 됩니다.

일반적인 형태의 자료구조 책은 1장은 자구에 대해서 설파하며, 고마운 책은 수학적 표기법 일명 $O(n)$을 소개합니다. 현기증을 불러오는 대부분의 책은 2장에서 '잘' 쓰지도 않는 최선, 최악, 평균(오메가, 빅오, 세타)이런거 소개하기도 합니다. '최선, 최악, 평균'에 관련된 증명도 나오고, 연습문제엔 좀 더 복잡한 점화식도 나옵니다. 간단한 증명이라서 어렵지 않게 풀 수 있습니다. 3장에선 배열을 4장에서 Linked List, 5장은 스택, 6장은 큐(혹은 데크)를 배열과 Linked List를 사용해서 구현하는 걸 소개합니다. 5장은 '수식표기법(전위, 후위, 중위)' 이런걸로 연습문제를 풀고, 6장은 데크를 가지고 비행기가 착률을 하니 마니 하면서 큐를 사용하는 응용에 대해서 논의합니다. 7장에선 트리, 8장에선 그래프를 배우고 dijkstra의 이론도 배우면서 뿌듯할 수 있는 기회를 얻고, 9장은 정렬, 10장은 해쉬 등을 학습합니다. 이 많은 것을 한 권에 배웁니다.

교수님들께서 20년전에 참고한 책이나 지금 서점에 파는 책이나 자료구조에 대한 내용은 거의 '같습니다.' 완벽하게 새로운 내용이 추가되지 않았습니다. 유독 한 군데 차이가 나는게 있는데, 그것은 "ADT" 입니다. 지금 판매되는 책의 대부분은 자료구조의 명세라 불리는 ADT에 대한 내용이 포함되어 있습니다. ADT 없는 자료구조 책은 구매할 때 조심하세요. 만약 책에 ADT가 없으면 스스로 ADT를 만드는 방법도 있지만, 가능하면 ADT가 존재하는 책을 선택하세요.

알고리즘

CS 전공자라면 CLRS를 권장합니다. CS 전공자 중에서 연구자라면 TAOCP를 목표로하세요. 전공자나 연구자는 아니지만 알고리즘에 관심이 많으시면 로버트 세지윅의 <<알고리즘 개정 4판>>을 권장합니다.

알고리즘의 경우 현재는 두 가지 관점으로 나눌 수 있습니다. 첫째는 전통적인 방식의 알고리즘을 학습하는 것으로 동적 계획법, 재귀 등과 같은 형태의 알고리즘 구현에 대한 것 입니다. 두번째는 분야에 자주 사용되는 알고리즘을 학습하는 것 입니다. 길찾기, 문자열 등과 같이 알고리즘을 특정 분야에 어떻게 적용되어 활용되는지 학습하는 것 입니다.

CS를 전공하는 분이나 문제풀이를 고민하는 분들은 전통적인 방식의 알고리즘 학습 방법을 권장합니다. 전공자나 문제풀이의 경우 문제를 해결하는 과정에서 알고리즘을 구현하는 과정이 필요합니다. 따라서 고전적으로 많이 사용되는 알고리즘 뿐만 아니라 알고리즘을 구성하는 원리 등을 활용해야 하는 경우가 많습니다. 문제풀이에 관심이 많으신 분들은 전통적인 방식의 알고리즘 학습 방법을 권장합니다.

반면에, 코드 작성 및 서비스 개선 및 구현이 고민이신 분들은 분야별 알고리즘 적용 방법을 학습하시길 권장합니다. 서비스 개선 및 구현을 위해서 대부분의 경우 잘 알려진 프레임워크나 라이브러리 등을 활용하기 때문에 모든 과정을 직접 구현할 필요는 없습니다. 따라서, 분야별 알고리즘 적용 방법을 학습하여 필요한 부분을 수정하는 경우가 많습니다. 코드 작성 및 서비스 개선 및 구현이 고민이신 분들은 분야별 알고리즘 적용 방법을 학습하시길 권장합니다.

문제풀이

자신이 사용하는 언어를 중심으로 설명하는 책을 선택하세요. 난이도는 별로 중요하지 않는데, 왜냐하면 대부분의 책이 거의 비슷한 수준을 다루고 있기 때문입니다.

현재 출간되는 자료구조 및 알고리즘에 관련된 대부분의 책은 코딩 테스트나 문제풀이와 관련된 책입니다. 코딩 테스트나 문제풀이의 교재를 선택함에 있어서 가장 중요한 것은 자신이 사용하는 언어를 한정하는 것입니다. 예를 들어, 흔히 말하는 백엔드 개발자 중에서 Spring Boot를 사용하고 있다면 가능하면 Java 언어를 사용해서 코딩 테스트나 문제풀이를 진행하는 책을 선택해야 합니다.

코딩 테스트나 문제풀이 과정에서 다른 언어를 활용하는 것을 허용하는 경우도 있지만, 프론트 개발자의 경우 JavaScript로 언어를 한정해서 코딩 테스트나 문제풀이를 제시하기도 합니다. 이 모든 경우의 가짓수를 고려해서 전략을 구성할 수 있는지는 차치하고, 코딩 테스트와 문제풀이의 본질을 고려한다면 자신이 사용하는 언어를 기반으로 책을 선택하시길 권장합니다. Python으로 코딩 테스트를 준비하고, Java로 만들어진 프레임워크로 포트폴리오를 제시하는 것은 두 가지 언어를 다뤄야 하기 때문에 생각보다 많은 비용이 소모됩니다. 따라서 어떤 선택을 하든, 코딩 테스트나 문제풀이의 본질 뿐만 아니라 자신이 가용한 시간과 노력을 잘 고려해서 선택하시기 바랍니다.

그리고 언어 기준으로 책을 선택하면 난이도가 비슷하기 때문에 가능하면 빠르게 2~3회 볼 수 있는 분량을 선택하세요. 자신에게 주어진 시간과 자신이 학습할 수 있는 책의 분량을 고려해서 선택하세요. 마지막으로 주어진 시간이 넉넉하다면 자신이 선택한 언어 이외의 다른 언어로 문제를 해결하는 것을 선택하는 것도 좋은 학습 방법 중 하나 입니다.

"이론보단 실전"이 중요하다.

저는 계속해서 '코딩 테스트나 문제풀이' 책을 가능하면 먼저 읽어보길 권장합니다. 국내의 교육 현실에서 이론적인 책보단 코딩 테스트나 문제 풀이 중심의 책을 먼저 접해야 한다고 주장합니다.

2013년 이후에 발매된 알고리즘 책은 전문적인 깊이를 추구하기 보다는 문제 풀이와 수학공식을 코드로 풀어내는데 집중하는 경향이 있습니다. 어떤 관점에서 보면 '코딩 테스트나 문제풀이' 중심의 책은 취업자를 대상으로 '요령'만 가르친다는 오해를 불러일이킬 수 있습니다. 저는 국내의 교육 현실에서 이론적인 책보단 코딩 테스트나 문제 풀이 중심의 책을 먼저 접해야 한다고 주장합니다.

코딩 테스트와 문제풀이 중심으로 진행되는 학습의 가장 큰 문제는 '밸런스'가 무너진다는 점 입니다. 이론과 실습의 비율이 적절하게 배합되지 않으면 '이론은 의미없고, 실습은 부담' 될 뿐이며, 역도 성립합니다. 그리고 과도한 코딩 테스트나 문제풀이 기반의 학습은 이론적인 깊이를 더해주지 못한다는 지적도 있습니다.

우리가 금단의 열매(혹은 독이든 독배)라 부르는 책는 모두 '구현'에 대한 내용이 빠져있습니다. 하물며 TAOCP는 이론도 수학공식으로 도배를 해 놔서 읽는다고 다 되는 책이 아닙니다. 심지어 1권에서 소개하는 MIX는 유사 기계어로 진행되기 때문에 컴퓨터 구조에 대한 이해도가 없으면 사실상 책을 읽을 방법이 없습니다. TAOCP는 '구현'보다 해당 이론의 증명 과정의 중요성을 높게 평가하고 있습니다. 그나마 TAOCP에 비해서 괜찮다고 평가받는 CLRS는 알고리즘을 잘 설명하고 있지만 구현에 대한 것은 pseudo 코드로 대체되어 있습니다. 가장 큰 문제는 좋다고 알려진 이론서를 다 읽어본 사람이 극소수란 점이다. 그렇기 때문에 다들 칭찬을 하지만 어디가 좋고, 왜 좋고, 누구에게 도움이 되지는 쉽사리 말하기 힘든면도 존재합니다. 앞의 두 권은 국부론이나 자본론처럼 '누구나 알고 있으나 읽진 않은 책'의 대표적인 책라 할 수 있다.

과도한 이론 중심 학습과 금단의 열매(혹은 독이든 독배)에 대한 무비판적인 칭찬은 소위 말하는 '입프로그래머'를 탄생시킵니다. 입으론 천지창조도 하고, UML 다이어그램 따위는 안중에도 없이 모든 코드를 한 번에 '리팩토링' 시킬 수 있는 능력의 소유자들이 어딘가 있다고 알려져 있습니다. 내일 당장이라도 운영체제 하나 만들 수 있는, 차세대 '리더들'을 대거 양성시키고 있습니다.

내가 알고 있는 것과 구현할 수 있는 것을 분명히 구분 할 수 있어야 합니다. '내가 알고 있으니 구현'도 가능하다고 믿는 특수한 부류의 개발자가 탄생하게 되는 배경에는 이론에 입각한 교육방법이 한 몫 하고 있습니다. 구현 중심의 학습에 대한 지적 사항이 이론중심의 학습에도 곧바로 적용됩니다.

자료구조와 알고리즘을 처음 접한다면 이론적인 책를 선택하는 것은 옳은 선택입니다. 틀린선택이 아닙니다. 하지만 무턱대고 '수학'으로 도배한 책을 선택하기 보다는 "구현"에 대한 측면을 고려한 책도 균형감 있게 고심했으면 합니다. "구현"만 추구하는 책도 좋지 않고, "이론"만 늘어놓는 책도 멀리해야 한다고 주장하지만, 그러한 주장은 듣기에만 좋을 뿐 실익이 없습니다.

공학을 다루는 입장에서 구현이 되지 않은 서비스, 작동되지 않는 코드에 어떤 가치를 부여할 수 있을지 여전히 의심스럽습니다. 구현이 가능한 상태를 기반으로 이론적인 부분을 계속해서 추가할 수 있어야 더 높은 곳으로, 더 나은 서비스를 제공할 수 있다고 믿고 있습니다. 이 글을 읽으시는 분들이 자신에게 맞는 책을 선택해서 좋은 개발자 혹은 좋은 공학자가 되기를 희망합니다.

그대가 무엇을 선택하든 '코드가 함께 하길(may the Code be with you)'

  • updated: 2023.10.02
    • 자료구조, 알고리즘, 문제풀이 형태로 책를 분류
    • 서론 및 결론 부분 추가
    • 표를 추가하여 내용을 요약

  1. 초급은 코드를 보면 내용은 대충은 알겠지만 설명이 불가능한 수준을 지칭하고, 중급은 설명은 가능한데 '연습문제'등과 같은 형태의 변형이 자유롭지 않은 수준을 말한다. 고급은 수학적으로 설명이 가능하고 변형이 가능하고, 새로운 형태의 자료구조나 알고리즘을 만들어서 즐겁게 사용하지만 해당 자료구조나 알고리즘을 수학적으로 증명하지 못하는 수준을 치칭한다. ↩︎