본문 바로가기

자료구조와 알고리즘(순한맛)

00장 - 들어가며

들어가며

 자료 구조와 알고리즘은 단순히 추상적인 개념이 아니다. 자료 구조와 알고리즘에 숙달하면 더 빠르게 실행되는 보다 효율적인 코드를 작성할 수 있고, 이는 오늘날의 웹과 모바일 앱에서 특히 중요하다. 만일 마지막으로 알고리즘을 마주한 게 대학 수업이나 면접이라면 알고리즘의 진정한 힘을 활용하지 못하고 있는 것이다.

 문제는 이러한 주제를 다루는 자료가 대부분 이해하기 어렵게 쓰였다는 점이다. 글은 수학 용어로 가득 차있고 수학자가 아닌 이상 도대체 무슨 말인지 알기 어렵다. 심지어 "쉬운" 알고리즘을 표방하는 책마저도 독자가 수학 석박사 학위를 취득했다고 가정한다. 결국, 무수한 독자들이 자신은 이러한 개념을 이해할 만큼 충분히 "똑똑하지" 않다고 생각하며 회피한다.

 하지만 자료 구조와 알고리즘은 전부 본질적으로 상식선에서 이해할 수 있다. 수학 표기는 그저 특수한 언어이며 어떤 수학이든 상식적인 용어로 설명할 수 있다. 이 책은 사칙연산과 지수와 로그 외에는 어떤 수학도 사용하지 않는다. 그 밖에 개념은 쉽고 분명한 말로 풀어서 설명하고, 많은 그림을 사용해 즐겁게 이해할 수 있도록 돕는다.

 자료 구조와 알고리즘을 이해했다면 효율적이고 빠르고 간결한 코드르 작성할 준비가 된 것이다. 여러 코드 대안의 장단점을 가늠할 수 있으며, 지식을 바탕으로 주어진 상황에서 어떤 코드가 가장 알맞은지 결정할 수 있다.

 학교에서 관련 주제를 공부 중이라서 혹은 기술 면접을 준비할 목적으로 이 책을 읽는 독자도 있을 것이다. 물론 이 책이 컴퓨터 과학 기초를 이해하기 쉽게 설명하고 있고 목표를 달성하는 데 크게 도움이 되겠지만, 자료구조와 알고리즘 개념이 일상적인 프로그래밍에 얼마나 큰 영향력을 발휘하는지 그 진가를 알아봤으면 좋겠다. 오늘 바로 활용할 수 있는 아이디어를 엄선해서 개념을 실제적이고 실용적으로 만들기 위해 특별히 노력을 기울였다.

 

이 책의 독자층

 이 책의 다음과 같은 독자에게
이상적이다.

  • 이제 막 기초 프로그래밍을 배웠지만 컴퓨터 과학 기초를 배움으로써 더 나은 코드를 작성하고 프로그래밍 지식과 기술을 키우고 싶은 개발자
  • 정규적인 컴퓨터 과학 수업을 받은 적이 없는 독학 개발자(또는 공부했지만 다 까먹은 개발자)면서 자료 구조와 알고리즘의 힘을 활용해 더 확장 가능하고 간결한 코드를 작성하고 싶은 개발자
  • 자료 구조와 알고리즘을 쉽고 명확하게 설명한 교재를 원하는 컴퓨터 과학도.
    (어떤 "고전적인" 교재를 사용하든 이 책을 훌륭한 보조 교재로 사용할 수 있다.)
  • 경력상 화룡한 적이 거의 없지만 다가올 기술 면접시험을 위해 자료 구조와 알고리즘 개념을 복습해야 하는 개발자

 언어와 독립적인 책을 만들기 위해 루비와 파이썬, 자바스크립트 같은 여러 프로그래밍 언어로 예제를 만들었으니 세 언어에 대한 기초적인 이해가 있다면 도움이 될 것이다. 하지만 독자가 다른 언어에 익숙하더라고 예제를 이해할 수 있게끔 애썼다. 그래서 각 언어마다 흔히 쓰이는 관용구가 있더라도 그 언어를 처음 접하는 사람에게 헷갈릴 수 있다고 느낄 관용구를 따르지 않았다.

 

이 책의 내용

 짐작했을 수 있겠지만 이 책은 대부분 자료 구조와 알고리즘을 논한다. 좀 더 구체적인 구성은 다음과 같다.

 1장 자료 구조가 중요한 까닭 2장 알고리즘이 중요한 까닭에서는 자료 구조와 알고리즘이 무엇인지 설명하고 알고리즘의 효율성을 결정하는 데 쓰이는 시간 복잡도 개념을 알아본다. 이때 배열과 집합, 이진 검색도 자세히 설명한다.

 3장 빅 오 표기법에서는 빅 오 표기법을 소개하면서 할머니도 이해할 수 있는 용어로 설명한다. 책 전반에 걸쳐 빅 오 표기법을 사용하므로 3장은 꽤 중요하다.

 4장 빅 오로 코드 속도 올리기5장 빅 오를 사용하거나 사용하지 않는 코드 최적화, 6장 긍정적인 시나리오 최적화에서는 빅 오 표기법을 더욱 상세히 알아보고 일사적인 코드를 더욱 빠르게 만드는 데 실제로 사용해 본다. 이 과정에서 버블 정렬과 선택 정렬, 삽입 정렬이라는 다양한 정렬 알고리즘도 다룬다.

 7장 해시 테이블로 매우 빠른 룩업8장 스택과 큐로 간결한 코드 생성에서는 해시 테이블과 스택, 큐라는 자료 구조를 추가로 논한다. 이러한 자료 구조가 어떻게 코드 속도와 간결성에 영향을 미치는지 보이고, 이를 사용해 현실적인 문제를 풀어본다.

 9장 재귀를 사용한 재귀적 반복에서는 컴퓨터 과학 세계의 기초 개념인 재귀를 소개한다. 재귀를 단계별로 나눠서 살펴보고 어떤 상황에서 어떻게 훌륭한 도구로 쓰이는지 알아본다.

 10장 속도를 높이는 재귀 알고리즘에서는 퀵 정렬과 퀵 셀렉트 같은 매우 빠른 알고리즘의 기반으로 재귀를 사용하면서 알고리즘 개발 능력을 한층 끌어올린다.

 이어서 11장 노드 기반 자료 구조12장 이진 트리로 속도 향상, 13장 그래프로 뭐든지 연결하기에서는 연결 리스트와 이진 리스트와 이진 트리, 그래프 같은 노드 기반 자료 구조를 알아보고 각각이 다양한 애플리케이션에서 어떻게 이상적으로 쓰이는지 보이겠다.

 마지막 장인 14장 공간 제약 다루기에서는 공간 복잡도를 알아본다. 공간 복잡도는 비교적 디스크 공간이 작은 장비를 프로그래밍하거나 빅 데이터를 다룰 때 중요하다.

 

이 책을 읽는 방법

 이 책은 순서대로 읽어야 한다. 어떤 책은 각 장을 독립적으로 읽을 수 있고, 어떤 부분은 생략할 수도 있지만, 이 책은 그런 종류의 책이 아니다. 각 장은 이전 장들을 읽었음을 전제하며, 책을 읽어나갈수록 점점 이해가 깊어지게끔 세심하게 구성됐다.

 알아둘 점이 또 있다. 쉽게 이해할 수 있도록 어떤 개념을 소개할 때 항상 모든 내용을 다 설명하지 않았다. 복잡한 개념을 나눠서 살펴볼 때, 여러 부분 중 작은 부분 하나를 먼저 알아보고, 다음 부분은 앞부분을 충분히 이해하고 나서 알아보는 것이 때로는 가장 좋다. 따라서 어떠어떠한 개념 정의가 나올 때, 그 주제를 다룬 절을 다 읽기 전에는 교과서적인 정의로써 받아들이지 말길 바란다.

 이는 일종의 트레이드오프다. 이 책은 모든 문장을 학문적으로 완전히 정확하게 만드는 대신 이해가 쉽도록 어떤 개념을 처음에는 매우 단순화시킨 후 시간이 흐르면서 명확히 하는 방식을 택했다. 하지만 결국에는 전체 개념을 정확하게 알 수 있을 테니 너무 걱정하지 말자.

 

온라인 지원

 책에 대한 더 많은 정보는 이 책의 웹 페이지에서 찾을 수 있는데 다음과 같은 방식으로 상호작용 할 수 있다.

  • 저자 및 다른 독자와의 토론 포럼에 참여
  • 내용 제안 또는 오타 등 오탈자 보고를 통해 책 개선에 기여

 각 장별 연습용 예제는 http://commonsensecomputerscience.com/에 있는 이 책의 코드 다운로드 패키지에 들어있다.

 깃허브 길벗 저장소 http://github.com/gilbutITbook/006981에서도 받을 수 있다.


참고 및 출처

누구나 자료 구조와 알고리즘
국내도서
저자 : 제이 웬그로우 / 심지현역
출판 : 길벗 2018.06.30
상세보기