코드 한 줄의 기록

코딩테스트 합격을 위해 반드시 알아야 할 자료구조 핵심 개념 완벽 정리 가이드 본문

코딩테스트

코딩테스트 합격을 위해 반드시 알아야 할 자료구조 핵심 개념 완벽 정리 가이드

CodeByJin 2025. 11. 15. 16:51
반응형

흔히 개발자들 사이에서 "코딩테스트 준비는 정말 힘들다"는 말을 많이 듣습니다. 특히 자료구조 부분에서 막힌다는 분들이 정말 많아요. 저도 처음에는 배열이 뭔지, 스택이 뭔지, 큐가 뭔지 헷갈리곤 했습니다. 하지만 지난 몇 년간 여러 회사의 코딩테스트를 준비하면서 깨달은 게 하나 있어요. 자료구조는 생각보다 어렵지 않다는 겁니다. 단지 제대로 된 순서와 방식으로 배우지 못했을 뿐입니다.

 

이번 글에서는 제가 직접 경험한 코딩테스트 준비 과정에서 얻은 자료구조 핵심 개념들을 여러분과 함께 정리해보겠습니다. 저와 마찬가지로 자료구조를 처음 접하거나, 어느 정도 배웠지만 헷갈리는 분들을 위해 가능한 한 쉽고 명확하게 설명하려고 노력했습니다. 어디서부터 시작해야 할까요?

자료구조가 정말 중요한 이유

먼저 자료구조를 왜 배워야 하는지 생각해봅시다. 코딩테스트에서는 단순히 문제를 푸는 것이 아니라, 효율적으로 푸는 것을 요구합니다. 예를 들어, 같은 문제를 푸는 두 가지 코드가 있다고 생각해보세요. 하나는 1초 안에 끝나고, 하나는 5초가 걸린다면 어느 것이 더 나을까요? 당연히 1초 안에 끝나는 코드가 더 좋은 코드입니다.

 

이렇게 효율성을 개선하는 핵심이 바로 자료구조입니다. 올바른 자료구조를 선택하면 같은 기능을 하더라도 처리 속도가 몇 배나 빨라질 수 있습니다. 코딩테스트를 진행하면서 시간 초과(Time Limit Exceeded, TLE)로 떨어지는 경우가 많은 이유도 바로 이것이에요. 단순히 코드가 작동하는 것만으로는 부족하고, 얼마나 효율적으로 작동하는가가 중요한 것입니다.

 

코딩테스트는 단순한 프로그래밍 능력을 테스트하는 것이 아닙니다. 주어진 문제를 얼마나 잘 분석하고, 적절한 알고리즘과 자료구조를 선택해서 해결할 수 있는가를 평가하는 것입니다. 따라서 자료구조에 대한 이해는 선택이 아닌 필수입니다.

기초부터 시작하기: 배열(Array)

자료구조를 배울 때 가장 먼저 배워야 할 것이 바로 배열입니다. 배열은 다른 모든 자료구조의 기반이 되기 때문입니다. 혹시 배열이 무엇인지 이미 알고 계신다면 빠르게 넘어가셔도 좋습니다만, 다시 한 번 정확히 정리해보겠습니다.

 

배열이란 같은 타입의 데이터를 연속된 메모리 공간에 저장하는 자료구조입니다. 예를 들어, 학교에서 반 아이들을 줄을 세워서 순서대로 번호를 매기는 것처럼 생각하면 됩니다. 각 아이는 고정된 위치에 있고, 우리는 위치(인덱스)만 알면 원하는 아이를 즉시 찾을 수 있습니다.

 

배열의 가장 큰 장점은 특정 위치의 데이터에 빠르게 접근할 수 있다는 것입니다. 시간 복잡도로는 O(1)이라고 표현합니다. 즉, 배열의 크기가 10이든 10,000이든 같은 시간에 접근할 수 있습니다. 이것을 상수 시간 접근(Constant Time Access)이라고 부릅니다.

 

그런데 배열에는 명백한 단점도 있습니다. 배열의 크기는 미리 정해져야 하고, 데이터를 중간에 삽입하거나 삭제하기 매우 복잡합니다. 예를 들어, [1, 2, 3, 4, 5]라는 배열이 있는데 2와 3 사이에 새로운 데이터 6을 넣으려면 어떻게 해야 할까요? 3, 4, 5를 모두 한 칸씩 뒤로 이동시킨 다음에 6을 삽입해야 합니다. 이렇게 되면 시간이 O(n)이 되어버립니다.

 

특히 배열의 처음에 데이터를 삽입하려면 모든 요소를 뒤로 밀어야 하므로 가장 비효율적입니다. 데이터를 자주 추가하고 삭제해야 하는 상황이라면 배열은 적합하지 않습니다. 이런 문제를 해결하기 위해 나온 것이 연결 리스트(Linked List)입니다.

연결 리스트(Linked List)로 유연성 확보하기

배열이 고정된 크기의 연속된 메모리에 데이터를 저장한다면, 연결 리스트는 메모리 곳곳에 흩어져 있는 데이터들을 '노드(Node)'라는 단위로 관리하면서 서로 연결하는 자료구조입니다. 마치 보물찾기처럼 첫 번째 노드에서 다음 노드의 위치를 알려주고, 그 다음 노드에서 또 다음 노드의 위치를 알려주는 식으로 연결되어 있습니다.

 

연결 리스트의 가장 큰 장점은 데이터의 삽입과 삭제가 쉽다는 것입니다. 특히 처음이나 끝에 데이터를 추가할 때는 O(1)의 시간 복잡도만으로도 가능합니다. 배열처럼 모든 요소를 이동시킬 필요가 없거든요. 단지 새로운 노드를 만들고 포인터(참조)만 조정하면 됩니다.

 

하지만 단점도 분명합니다. 특정 위치의 데이터에 접근하려면 처음부터 따라가야 하기 때문에 시간이 O(n)이 걸립니다. 만약 100번째 요소에 접근하려면 1번째부터 99번째까지 모두 거쳐야 합니다. 이것을 선형 시간 접근(Linear Time Access)이라고 부릅니다.

 

연결 리스트에는 여러 종류가 있습니다. 단순 연결 리스트, 양방향 연결 리스트(Doubly Linked List), 원형 연결 리스트(Circular Linked List) 등이 있습니다. 코딩테스트 준비를 할 때는 단순 연결 리스트의 개념을 정확히 이해하는 것만으로도 충분합니다.

스택(Stack)과 큐(Queue): LIFO와 FIFO 구분하기

이제 조금 더 재미있는 부분입니다. 스택과 큐는 배열이나 연결 리스트 위에 구현되는 추상 자료형(Abstract Data Type)입니다. 즉, 내부적으로는 배열이나 연결 리스트를 사용하지만, 데이터를 삽입하고 삭제하는 방식을 제한하는 것이죠.

 

스택(Stack): 마지막에 들어온 것이 먼저 나간다

  • Push: 데이터를 스택의 맨 위에 추가
  • Pop: 맨 위 데이터를 제거하고 반환
  • Peek: 맨 위의 데이터를 제거하지 않고 확인
  • isEmpty: 비어있는지 확인

스택은 LIFO(Last In First Out) 구조로, 식당의 접시 쌓기와 브라우저의 뒤로가기 기능이 대표적 사례입니다. 괄호 검사, DFS, 후위 표기법 계산 등 문제에서 많이 쓰입니다.

 

큐(Queue): 먼저 들어온 것이 먼저 나간다

  • Enqueue: 큐의 뒤에 추가
  • Dequeue: 큐의 앞에서 제거하고 반환
  • Peek: 맨 앞의 데이터 확인
  • isEmpty: 비어있는지 확인

큐는 FIFO(First In First Out) 구조로, 은행 대기열, 마트 계산대 줄, 작업 스케줄링 등에서 활용됩니다. BFS, 최단 거리 구하기 문제에 필수입니다.

해시 테이블(Hash Table): 빠른 검색의 비결

해시 테이블은 키와 값의 쌍으로 데이터를 저장하는 자료구조입니다. 파이썬의 딕셔너리, Java의 HashMap 등이 대표적입니다. 평균적으로 O(1) 시간에 원하는 데이터를 찾을 수 있습니다.

 

단점은 해시 충돌(Hash Collision)이 발생할 수 있다는 것인데, 체이닝이나 오픈 어드레싱으로 해결합니다. 중복 검사, 빈도 계산, 애너그램 판별 등에서 활용도가 높습니다.

트리(Tree)와 이진 트리(Binary Tree)

트리는 계층적 구조를 가진 비선형 자료구조입니다. 루트, 부모, 자식, 리프, 높이, 깊이 등 다양한 용어가 있습니다.

 

이진 트리는 각 노드가 최대 두 개의 자식을 가지며, 완전 이진 트리, 이진 탐색 트리(BST), 균형 이진 트리 등이 있습니다. 트리의 순회, 경로 문제, LCA 찾기 등 코딩테스트에서 자주 출제됩니다.

힙(Heap): 우선순위 큐의 주인공

힙은 완전 이진 트리의 구조로 구현합니다. 최대 힙은 루트가 최댓값, 최소 힙은 루트가 최솟값입니다. 삽입·삭제는 O(log n)이며, 검색은 O(1)입니다.

 

다익스트라, 프림, K번째 값 찾기 등에서 필수로 사용됩니다. 파이썬 heapq 사용 시 최소 힙이 기본이므로 최대 힙은 -1을 곱한 값을 사용하세요.

그래프(Graph)와 그 활용

그래프는 노드와 간선으로 이루어진 복잡한 연결관계의 자료구조입니다. 방향 그래프, 무방향 그래프, 가중치 그래프, 사이클 등 다양하게 분류됩니다.

 

그래프와 관련된 탐색(DFS/BFS), 최단 경로(다익스트라, 벨만-포드), 최소 신장 트리(크루스칼, 프림) 등 알고리즘이 코딩테스트의 난관으로 자주 등장합니다.

실제 코딩테스트 준비 팁

  • 각 자료구조의 시간복잡도와 특성 정확히 익히기
  • 자료구조 별 실전 문제 많이 풀기
  • 시간·공간 복잡도 항상 고려하기
  • 여러 자료구조·알고리즘 결합 문제도 도전

자료구조는 처음엔 어려울 수 있지만, 반복 학습과 실전 문제 해결로 반드시 실력이 늘어납니다. 올바른 자료구조와 알고리즘 설계만이 효율적인 코드를 만드는 지름길입니다.

 

지금 준비하고 있더라도 막막한 것이 당연합니다. 매일 꾸준히, 핵심 개념을 다시 정리하면서 성장하는 자신을 믿으세요. 포기하지 않으면 반드시 원하는 결과를 얻을 수 있습니다. 여러분의 코딩테스트 합격을 진심으로 응원합니다. 힘내세요!

 

 

효율적인 코딩테스트 공부 시간 분배 전략: 누구나 따라할 수 있는 실전 노하우 전수

취업을 준비하면서 가장 신경 쓰이는 과정 중 하나가 바로 코딩테스트입니다. 특히 SW 개발 직군에 지원하거나 IT 대기업, 중견·중소기업에 이직을 고려하시는 분들이라면 코딩테스트의 중요성

byteandbit.tistory.com

 

반응형