0. 들어가며

Python을 이용한 알고리즘과 자료구조에 대해 공부한 내용을 바탕으로 간단히 포스팅할 계획입니다. 스파르타 코딩클럽의 알고보면 알기쉬운 알고리즘 강의를 수강하고 강의안을 참고하여 정리하였습니다.

이번 포스트에서는 알고리즘이란 무엇인지, 그리고 왜 공부해야하는지에 대해 살펴보도록 하겠습니다.


1. 알고리즘이란?

어떤 문제의 해결을 위하여, 입력된 자료를 토대로 하여 원하는 출력을 유도하여 내는 규칙의 집합. 여러 단계의 유한 집합으로 구성되는데, 각 단계는 하나 또는 그 이상의 연산을 필요로 한다. [표준국어대사전]

어떤 문제가 있을 때, 그것을 해결하기 위한 일련의 동작들의 모임을 알고리즘이라고 합니다.

  • 기말고사 직전 산더미인 과제를 해결하기
  • 집에서 학교/회사로 출근하기
  • 우유와 계란을 사오는 심부름하기

이런 문제를 푸는 모든 방법이 알고리즘에 해당합니다.

  • 과제를 해결하는 방법은 어떤 과제를 먼저 해야할지 과제의 중요성(학점 반영도)에 의해 순서를 정할 수도 있고, 데드라인에 따라 정할 수도 있습니다.
  • 집에서 출근하는 방법은 다양합니다. 지하철, 버스, 택시, 도보 등을 이용하여 최소 환승이나 최소 시간 혹은 비용에 따라서 최선의 방법이 달라집니다. 최소 환승이 중요하다면 회사에 한번에 가는 버스를 쭉 타고 갈수도 있고, 최소 시간이 중요하다면 (물론 밀리지 않는 시간에) 택시를 타고 빠르게 갈 수 있습니다. 비용이 가장 중요하다면 (추천하지는 않습니다.) 걸어갈 수 있습니다.
  • 우유와 계란을 사오는 심부름도 편리함을 기준으로 한다면 쿠팡 로켓프레시를 이용해서 편하게 주문을 하면 내일 집 앞에 도착합니다. 그러나 바로 사와야한다면 집에서 제일 가까운 슈퍼에서 바로 사오면 됩니다. 비용을 아끼는게 중요하다면 직접 농장에 가서 일을 하고 일삯으로 계란과 우유를 받아오는 방법이 최선의 방법일 수 있습니다.

이렇듯 알고리즘은 미리 정해진 기준에 따라 문제를 해결하는 것이며, 다양한 해결 방법이 있습니다.

참고로 알고리즘의 어원은 알고리즘은 9세기 페르시아 수학자로 ‘대수학의 아버지’라 불리는 아부 압둘라 무함마드 무사 알콰리즈미(이름이 매우 기네요)의 이름을 라틴어화한 알고리스무스(Algorismus)에서 유래한 표현입니다. 또한 대수학의 아버지라 불리는 만큼 대수학을 뜻하는 앨지브라(Alebra) 역시 그의 저서로부터 기원한다는 사실도 놀랍습니다.

2. 알고리즘을 공부해야하는 이유

알고리즘을 공부해야하는 이유는 크게 2가지 입니다.

  • 좋은 개발자가 되기 위해
    • 개발자는 프로그램을 만드는 직업입니다. 즉, 좋은 개발자가 되려면 좋은 프로그램을 만들 줄 알아야합니다.
    • 좋은 프로그램이란 적은 공간을 이용해서 빠른 속도로 수행되는 프로그램입니다.
    • 그런 프로그램을 만들기 위해서는 경우에 따라 특정 자료구조나 접근방법을 사용해야 합니다. 즉, 프로그램을 잘하기 위해서는 여러 자료구조와 방법들을 배우고 익혀야 좋은 프로그램을 만들 수 있습니다.
  • 좋은 회사에 취직하기 위해
    • 많은 회사들이 코딩테스트를 통해 개발자를 뽑고 있습니다. 카카오, 삼성, 구글 등 국내외 유망 IT 기업들 외에 많은 스타트업까지 코딩테스트를 개발자의 필수 관문으로 삼고 있습니다.
    • 코딩테스트는 기초적인 지식과 해결책으로 적절한 사고를 할 수 있는지에 대해 검증하는 관문으로, 자료 구조와 접근 방법에 대 학습을 필요로 합니다.

3. 내가 알고리즘을 공부한 이유

필자의 개인적인 동기는 크게 2가지 입니다.

코드를 읽는 눈

Github 내 Bertsum 소스코드 중 일부


작년에 딥러닝 분석을 위해 소스 코드를 뜯어보고 수정 적용할 일이 있었습니다. 저자의 깃헙 레포에서 여러가지 model source 코드와 preprocess 등의 코드를 목적에 맞게 고쳐야했습니다만… 남의 코드를 읽고 이해해서 목적에 맞게 고치는 일이 쉽지 않습니다. 기본기를 다지고 프로그래밍 연습을 통해 구조적으로 빨리 읽고 이해하는 능력이 필요하다고 느꼈습니다.

코드의 효율적 구현

지난 n년간의 내가 작성한 과제 코드들.jpg


알고리즘과 자료구조를 배우면서 ‘학교 다닐 때 이것을 알았으면 얼마나 좋았을까?’ 라는 부분이 한두개가 아니었습니다. 여러 수업과 대외 활동에 코드를 제출했지만, 기본적으로 CS적 마인드가 없이 코딩하다보니 효율적인 코딩과는 거리가 있었던 것 같습니다. 대학원 데이터마이닝이론수업에서 방법론들을 밑바닥 코드로 구현한 적 있습니다. 많은 연산을 수행하고 아웃풋이 나와야하는데 어떻게 수행하든 맞는 결과가 나오면 된다는 마인드로 과제를 한게 아닌가 생각이 들었습니다. 따라서 CS적 마인드로 영리한 프로그래밍을 하기 위해 알고리즘 공부의 필요성을 느꼈습니다.

제가 전공이 CS가 아니기 때문에 심도 깊은 포스팅은 아니겠지만, 비개발자의 입장에서 자료구조와 알고리즘에 대해 간단히 정리하고 실제 Python 코드를 통한 구현까지 적용하여 올리려합니다.

다음 포스팅에서는 알고리즘의 기본 구현과 시간 복잡도, 공간 복잡도에 대해서 다루도록 하겠습니다.