Profile

창조적이고 생산적이고 싶은 개발자 블로그

검바위길

Introduction to algorithms #1 기초

Introduction to algorithms

가장 유명한 알고리즘 입문서이자 개발자 필독서에 항상 꼽히는 책이다.
1300 페이지에 달하는 어마어마한 분량과 엄청난 무게의 압박때문에 쉽사리 손대지도, 막상 손댄다고해도 완독하기 쉽지 않은 책으로도 유명하다.

하지만 명서라고 꼽히는 이유가 있는 만큼 이번 기회에 나름대로 쉽게 정리하면서 읽어 볼 생각이다.
언어 공부도 할 겸 예제 소스는 Go언어로 작성할 생각이다.
영 안맞으면 언제 언어가 바뀔지는 모름...

알고리즘의 역할

알고리즘(Algorithm)이란?

  • 어떤 값이나 값의 집합을 입력으로 받아 또 다른 값이나 값의 집합을 출력하는 잘 정의된 계산 절차
  • 잘 정의된 계산 문제를 풀기 위한 도구
    • 입력과 출력의 관계를 명확하게 나타내기 위한 도구

어떤 문제를 알고리즘으로 풀 수 있을까?

  • 전세계 엄청난 양의 데이터를 검색할 수 있도록 해주는 구글
    • 키워드에 매칭되는 웹페이지 상단 표시, 연관 키워드 추천 등...
  • 네비게이션의 최단 거리 안내
  • 학교 운동장에서 키 순으로 한 줄 서기
    • 적당히 키 큰 애들과 작은 애들 그룹으로 나누고 그룹내에서 비교해서 줄세우는 방법 등

이렇게 주위에서 손 쉽게 찾아볼 수 있는 예가 있을 만큼 알고리즘은 어렵고 먼 것이 아니라 실용적이고 범용적이다. 또한, 사례에서 설명한 내용들이 모든 경우에 정답이 아닐 수 있는 것 처럼, 알고리즘은 주어진 상황(입력)에 맞는 최상의 결과(출력)을 찾기위한 일련의 과정이라고 설명할 수 있다.

최고의 알고리즘?

개인적인 의견이긴하지만 어느 상황에서건 적용되는 최고, 최상의 알고리즘은 있을 수 없다고 생각한다.
(마스터 알고리즘이라는 책에서 머신러닝을 활용해 모든 문제를 해결할 수 있는 '마스터 알고리즘'에 대해서 설명하는데 도전적일 수는 있으나 공상과학 느낌이 들었던 책.)

만약 50원, 100원, 500원으로 세 종류로 동전을 분리해야 할 일이 있다고 해보자.
1000개의 동전을 분류하려면 손으로 세거나 동전계수기(가정집에 이런게 있을리가 없긴 하지만 있다 쳐보자)를 이용하는 방법이 있을 것이다. 당연히 동전 계수기를 이용하면 엄청나게 효율좋게 동전을 세줄 것이다.

하지만 동전 10개를 분류하는데에 동전 계수기를 이용한다고 하면 전원 연결하랴 동전 모아서 넣으랴 숫자 확인하랴.
그냥 손으로 분류하는게 훨씬 빠르다.(극단적인 예)

정리

잡설만 길었지만 정리하자면 알고리즘 연구한다는 것이란 주어진 상황에서 가장 효율적인 절차를 찾는 방법을 연구하는 과정이라고 해도 무방할 것 같다.
단지 시간 복잡도 등 계산 복잡도 이론에서의 효율성에만 국한할 것이 아니라 외부적인 상황까지 포함된 다방면의 문제 해결능력을 향상시킬 수 있다고 생각하고 개발자에게 필수적인 능력인 빠른 사고능력을 배양하는데에도 도움을 준다고 생각한다.
본격적인 알고리즘의 대한 소개 및 정리는 다음 장에서 이어서 진행할 예정이다.