자료구조와 알고리즘 시작하기
목차
컴퓨터 프로그래밍을 잘하려면 알고리즘이 중요하다고 말합니다.
컴퓨터공학에서의 알고리즘의 역사는 100년 정도밖에 되지 않을 정도로 새로운 학문인데요. 알고리즘이 정확히 무엇인지는 모를지라도 ‘유튜브의 알고리즘’이라던가 ‘알파고의 알고리즘’ 등의 인공지능에 대해서는 미디어에서 많이 알려졌고 또 의미도 충분히 이해할 수 있습니다.
컴퓨터 공학에서 말하는 알고리즘은 미디어에서 볼 수 있는 몇개의 사례가 아니라 광범위한 의미를 담고 있습니다.
그런데 이 알고리즘에는 항상 자료구조가 따라다닙니다. 알고리즘은 쉽게 말해 어떤 일을 처리하는 과정에 대한 방법을 기술하는 것인데 컴퓨터가 일을 처리하기 위해서는 자료(Data)를 조작해야 합니다.
컴퓨터 역사의 초기에는 자료구조를 분리하는 관점이 약했으나 점점 IT기술이 발전하면서 자료의 중요성이 커집니다. 또 알고리즘은 자료구조의 형태에 따라 달라지기 때문에 이 둘을 통합하여 가르치고 있습니다.
이 포스팅 시리즈에서는 자료구조와 알고리즘을 C++로 구현하는 튜토리얼을 진행합니다.
자료구조와 프로그래밍
자료구조는 0과1의 비트로 구성된 컴퓨터의 메모리를 효율적으로 사용하기 위해 데이터를 구성하는 방식입니다.
기본이 되는 자료구조로 배열(Array), 스택(Stack), 링크드리스트(Linked List), 해시테이블(Hash Table) 등이 있습니다.
각각의 자료구조는 속도나 기능 등에서 장단점이 있습니다. 자료구조와 알고리즘을 학습한다는 것은 위의 자료구조의 원리를 이해한 후 직접 구현하는 것을 의미합니다.
이는 프로그래밍 언어의 학습과는 구분됩니다.
보통 프로그래밍 언어 과정은 거의 대부분 문법(syntax)적인 부분을 학습합니다. 물론 문법을 배울 때도 자료구조와 알고리즘을 배우는 것이지만 그것만으로는 부족합니다.
프로그래밍을 배우는 목적은 제대로 작동하는 프로그램을 만들기 위해서 입니다.
문법만 배우고 알고리즘을 배우지 않으면 제대로 작동하는 프로그램을 만들 수 없습니다. 그래서 컴퓨터공학과에서는 보통 1학년 때 프로그래밍 언어의 문법적인 부분을 배우고 2학년 부터 자료구조와 알고리즘을 학습하도록 하고 있습니다.
물론 이것을 시작하기 위해 1년이나 필요하지는 않습니다. 프로그래밍의 기초학습을 끝난 후에 하는게 조금 더 학습에 유리하다는 말입니다.
알고리즘
알고리즘은 특정 목적을 달성하기 위한 구체적 명령들의 집합, 구현방식이라고 볼 수 있습니다. 컴퓨터공학의 용어이지만 사람을 비롯한 자연도 알고리즘을 사용하고 있습니다.
예를 들어 학교를 가기 위한 목적을 달성하기 위해서 아침에 잠자리에서 일어나서 등교준비를 하고 집을 나섭니다. 학교까지 가는 방법은 걸어가거나, 버스를 타거나 선택할 수 있고 등교시간을 잘 지켜야 합니다.
자연도 알고리즘을 가지고 있습니다. 아침에 해가 뜨고 밤에 해가 지는 것이나 봄이 오면 꽃이 피고 겨울이 오면 눈이 내리는 것도 모두 자연의 알고리즘으로 볼 수 있습니다. 또 지구상의 모든 동식물들이 이런 자연의 알고리즘에 순응하기 위해 부단히 노력하는 것도 볼 수 있습니다.
이 모든 과정은 컴퓨터 프로그램으로 똑같이 시뮬레이션 할 수 있습니다. 알고리즘이 특별한 기술이 아니라 실제 세계를 가상의 세계인 컴퓨터 안에 구현하는 것을 목적으로 개발되었기 때문입니다.
알고리즘은 실제 세계를 컴퓨터로 재현할 수 있을 뿐 아니라 미래의 예측도 가능하게 합니다. 자연을 예측하는 기후 분석 알고리즘, 환경오염 측정 알고리즘이 대표적 입니다.
남극의 빙하가 녹으면 지구는 어떻게 될지 사실 인류가 오늘만 산다면 별로 신경쓸 일이 아닙니다. 실제 세계의 데이터에 근거하여 알고리즘으로 분석해보니 현재 추세라면 육지의 몇 퍼센트가 물에 잠길지도 대략 알 수 있습니다.
만약 이런 예측 기능이 없다면 인간은 코앞에 닥친 위기도 모른체 지금도 무분별하게 자연을 파괴하고 있을 것 입니다.
이렇듯 알고리즘은 먼나라 이야기가 아니라 우리의 생활부터 인류의 생존에까지 필요한 학문입니다.
C++의 자료구조와 알고리즘
알고리즘을 학습하기 가장 좋은 프로그래밍 언어는 고전인 C언어라고 합니다. 다만 C언어는 각종 플랫폼의 프레임워크가 발달한 현대에는 좀 실용성에 한계가 있습니다.
자바와 함께 실무에서 많이 쓰이는 C++로 알고리즘을 배우면 매우 실용적으로 C++ 알고리즘을 배우는 것은 탁월한 선택입니다. 특히 C++은 다른 언어보다 속도 효율이 좋기 때문에 성능을 중요시하는 프로그램은 거의 C++로 개발되고 있습니다.
C++ 는 정적인(static) 언어로 모든 자료의 형태(type)를 직접 지정해야 하고 또 메모리의 관리도 직접해야 합니다. 동적인(dynamic) 언어나 메모리를 관리를 가상머신이 하는 언어와는 차이점이 있습니다.
다른 언어보다 관리해야할 부분이 많다는게 도전이 될 수 있습니다. 그러나 그 만큼 컴퓨터와 기계(Hardware)에 대하여 더 깊은 이해를 할 수 있습니다.
C++가 좀 어려운 언어인 것은 사실입니다. 아래의 링크에는 C++ 튜토리얼도 만들고 있으니 관심있는 분은 참고바랍니다.
학습준비사항
- C언어나 C++ 기본지식
- C++ 개발환경 (MS비주얼스튜디오, Dev-C++ 등)
요약
C++로 자료구조와 알고리즘 시작하기의 개요를 알아봤습니다.
일단 알고리즘이란 용어에 대하여 너무 어렵게 접근하는 것보다는 우리 일상의 문제를 컴퓨터로 옮기는 일이다~ 라고 생각하고 시작하면 좋을 것 같습니다.
알고리즘은 문제를 푸는 것과 같습니다.
처음부터 어려운 문제에 매달리면 빠르게 흥미도 식고 열정도 떨어집니다.
초보자가 동기부여를 위해서 탄탄한 기초를 쌓은 후,
간단한 문제를 푸는 것에서 시작해서 점점 어려운 문제로 나아가는 방식이 좋습니다.
알고리즘은 좋은게 한번 습득한 알고리즘은 언어와 무관하게 사용할 수 있습니다. 정적이고 메모리를 관리해야 하는 C++의 알고리즘 구현은 다른 언어보다 품이 더 많이 들어가지만 C++로 알고리즘을 배우면 파이썬이나 자바스크립트 등으로 구현하는 것은 매우 쉬운 일이 될 것입니다. 약간의 응용이 필요할 뿐입니다.
이 글을 읽는 분들의 알고리즘 학습에 건투를 빕니다!
외부참조문서
What is an Algorithm? 자료구조와 알고리즘 시작하기
Dev-C++ 설치하기 테스트 (C언어 / C++ 통합개발환경)