언젠가부터 개발자 채용 과정에서 코딩 테스트를 보는 기업이 늘어나자 이런 질문이 줄어들었습니다. 알고리즘이 취업과 직결된 이후 알고리즘을 묻지도 따지지도 않고 공부하게 된거죠.
취업할 때 코딩 테스트를 보지 않아도 된다면 어떨까요? 취업에 관계가 없더라도 소프트웨어 엔지니어라면 알고리즘을 반드시 배워야 할까요?
검증된 표준 라이브러리를 쓰면 되는데 자료구조랑 알고리즘을 반드시 배워야 할까요?
자료구조(Data Structure)는 컴퓨터가 데이터를 효율적으로 다룰 수 있게 도와주는 데이터 보관 방법과 데이터에 관한 연산의 총체를 뜻합니다. 예를 들면 int도 자료구조입니다. int는 32비트 메모리 공간 안에 수를 할당하되 첫 비트를 부호 표현에 사용하는 등의 ‘보관 방법’을 정의하고 있고, 덧셈/뺄셈/나눗셈/곱셈/논리/시프트 등 다양한 ‘연산’ 또한 정의하고 있습니다.
자료구조는 다음 그림과 같이 단순 자료구조(Primitive Data Structure)와 복합 자료구조(Non-Primitive Data Structure)로 나뉩니다. 단순 자료구조는 조금 전에 이야기했던 int를 포함해 프로그래밍 언어에서 통상적으로 제공하는 기본 데이터 형식을 말합니다.
복합 자료구조는 다시 선형 자료구조(Linear Data Structure)와 비선형 자료구조(Non-Linear Data Structure)로 나뉩니다. 선형 자료구조는 다음 그림처럼 데이터 요소를 순차적으로 연결하는 자료구조로, 구현하기 쉽고 사용하기도 쉽습니다. 배열(Array_과 링크드 리스트(Linked List), 스택(Stack), 큐(Queue) 등이 여기에 해당합니다.
비선형 자료구조는 선형 자료구조와 달리 데이터 요소를 비순차적으로 연결합니다. 다음과 같이 한 데이터 요소에서 여러 데이터 요소로 연결되기도 하고, 여러 데이터 요소가 하나의 데이터 요소로 연결되기도 합니다. 트리와 그래프가 바로 여기에 해당합니다.비선형 자료구조는 선형 자료구조와 달리 데이터 요소를 비순차적으로 연결합니다. 다음과 같이 한 데이터 요소에서 여러 데이터 요소로 연결되기도 하고, 여러 데이터 요소가 하나의 데이터 요소로 연결되기도 합니다. 트리와 그래프가 바로 여기에 해당합니다.
자료구조와 관련해서 알아두면 좋은 개념이 한 가지 더 있습니다. 바로 추상 데이터 형식, 다시 말해 ADT(Abstract Data Types)인데요. 이것은 자료구조의 동작 방법을 표현하는 데이터 형식입니다. 정리하자면 ADT는 자료구조가 갖춰야 할 일련의 연산이라고 할 수 있습니다. 이 연산을 C 언어로 표현하면 함수가 됩니다.
리스트를 예로 들면, 리스트는 데이터에 순차적으로 접근해서 그 데이터를 다룰 수 있도록 여러 기능을 제공해야 합니다. 목록의 특정 위치에 있는 노드에 접근(Get)하거나, 목록의 마지막에 데이터를 추가(Append)하거나, 목록의 중간에 삽입(Insert)하거나, 삭제(Remove)하는 기능들 말입니다.
이렇게 ADT가 청사진을 제시하면 자료구조는 이를 구현합니다. 배열로 리스트를 구현한다고 가정하면 배열의 길이가 곧 리스트의 길이가 되고 배열의 첫 요소는 시작 노드, 배열의 마지막 요소는 마지막 노드가 됩니다. 그리고 현재 다루고 있는 요소의 첨자(Index)가 현재 노드가 되겠죠. 여기에 탐색/추가/삽입/수정/삭제와 같은 기능을 구현하면 하나의 자료구조가 완성됩니다.
ADT와 자료구조의 개념이 조금 이해되시나요? ADT는 개념을 제시하고 자료구조는 구현을 포함합니다.
C#이나 자바, 파이썬을 사용해봤다면, 이 표에서 소개한 것보다 더 많은 자료구조 라이브러리를 제공한다는 것을 알고 계실텐데요. 대개는 이렇게 제공되는 자료구조를 적절히 활용하기만 해도 소프트웨어 개발을 잘 할 수 있습니다.
첫째, 자료구조의 내부를 이해하면 라이브러리에서 엉뚱한 자료구조를 선택하는 일을 피할 수 있습니다. 동일한 ADT를 사용하더라도 자료구조에 따라 애플리케이션 성능이 크게 달라질 수 있습니다. 가령 네트워크 애플리케이션의 입출력 버퍼에는 링크드 큐보다 환형 큐를 사용하는 것이 처리 속도 면에서 유리하고, 메모리의 효율이 더 중요한 애플리케이션에서는 링크드 큐가 환형 큐보다 나은 선택일 수 있습니다. 자료구조 지식이 있는 프로그래머는 그 이유를 이해하고 라이브러리 문서를 통해 적절한 자료구조를 선택할 수 있습니다.
둘째, 자료구조는 알고리즘이 데이터를 효율적으로 사용할 수 있게 도와주는 핵심 부품 역할을 하기 때문입니다. 다시 말해, 자료구조를 모르면 알고리즘을 공부하는 데 어려움이 따릅니다.
알고리즘(Algorithm)은 9세기 페르시아 수학자 알 콰리즈미(Al-Khwarizmi)의 이름에서 유래된 말로 어떤 문제를 풀기 위한 단계적 절차를 뜻합니다. 알고리즘을 설계한다는 것은 문제 풀이 절차를 설계한다는 의미이고, 알고리즘을 구현한다는 것은 프로그래밍 언어를 이용해서 문제 풀이 절차를 실제로 동작하는 코드로 작성한다는 의미입니다.
알고리즘을 공부한다는 것은 어떤 문제를 분석해서 컴퓨터가 알아들을 수 있는 형태로 해법을 설계하고 구현하는 과정을 익힌다는 의미입니다. 알고리즘 학습은 단순히 문제 풀이 요령을 익히는 것이 아닙니다. 알고리즘 동작에 소요되는 메모리(공간)와 프로세싱 파워(시간)를 깊이 이해하고, 자원을 효율적으로 활용하면서도 고성능의 코드를 작성하는 방법을 익히는 것입니다.
현대 프로그래밍 언어의 대부분은 탐색, 정렬과 같은 고전 알고리즘을 구현한 API를 표준 라이브러리로 제공합니다. 알고리즘을 공부하면서 익힌 지식은 눈앞에 발생한 문제를 해결할 때 가장 적절한 API를 선택하는 데에도 도움이 됩니다.
예를 들면 어떤 문제를 해결할 때 메모리 효율과 탐색 속도 중 어느 요소를 더 중요하게 여기는가에 따라 레드 블랙 트리를 선택할지 해시 테이블을 선택할지 판단할 수 있게 되지요. 알고리즘을 체계적으로 공부하지 않아도 프로그래밍 할 수 있지만, 더 나은 프로그래머가 되기 위해서는 알고리즘에 대해 제대로 알아둘 필요가 있습니다.
좋은 목수는 특정 상황에 맞는 연장을 꺼내 쓰는 법을 알고 있습니다. 좋은 프로그래머 역시 특정 문제에 어떤 자료구조와 알고리즘을 적용해야 할지 알고 있습니다.
자료구조와 알고리즘을 반드시 배울 필요는 없지만, 배워두면 좋은 프로그래머로 성장하는데 큰 도움이 된다는 사실을 알아두셨으면 합니다.
최신 콘텐츠