코딩을 공부하다 보면 알고리즘과 함께 자주 등장하는 단어가 있습니다. 바로 자료구조입니다. 처음 이 말을 들으면 괜히 어렵게 느껴집니다. 자료는 데이터라는 뜻인 것 같고, 구조는 뭔가 복잡한 설계처럼 느껴지기 때문입니다. 그래서 많은 입문자가 자료구조를 공부하기 전부터 부담을 갖습니다.
저도 처음에는 자료구조가 너무 어렵게 느껴졌습니다. 배열, 리스트, 스택, 큐, 해시, 트리, 그래프 같은 단어를 한꺼번에 보니 어디서부터 시작해야 할지 막막했습니다. 특히 알고리즘 문제 풀이를 하다가 “이 문제는 스택으로 풀면 됩니다”라는 설명을 보면, 문제보다 설명이 더 어렵게 느껴졌습니다.
그런데 자료구조를 조금씩 공부하면서 생각이 바뀌었습니다. 자료구조는 어려운 이론이라기보다 데이터를 어떻게 담고 꺼내 쓸지 정하는 방법에 가깝습니다. 책을 책장에 꽂을지, 서랍에 넣을지, 번호표를 붙일지에 따라 찾는 속도가 달라지는 것처럼, 코딩에서도 데이터를 어떤 방식으로 저장하느냐에 따라 코드가 훨씬 쉬워지거나 빨라질 수 있습니다.
자료구조는 데이터를 담는 그릇이다
자료구조를 가장 쉽게 이해하려면 그릇을 떠올리면 됩니다. 같은 음식이라도 접시에 담을 수도 있고, 도시락통에 담을 수도 있고, 컵에 담을 수도 있습니다. 음식의 종류와 먹는 방식에 따라 어울리는 그릇이 다릅니다.
코딩에서도 마찬가지입니다. 숫자 여러 개를 순서대로 저장하고 싶을 때, 이름과 전화번호처럼 짝이 있는 데이터를 저장할 때, 가장 나중에 넣은 데이터를 먼저 꺼내야 할 때, 먼저 들어온 데이터를 먼저 처리해야 할 때 각각 어울리는 자료구조가 있습니다.
처음에는 모든 자료구조를 한 번에 외우려고 하지 않아도 됩니다. 중요한 것은 “이 데이터는 어떤 방식으로 관리하면 편할까?”라는 감각을 키우는 것입니다. 자료구조는 단순히 시험 문제를 풀기 위한 지식이 아니라, 코드를 더 깔끔하고 효율적으로 만들기 위한 기본 도구입니다.
배열과 리스트는 가장 기본적인 자료구조
자료구조 공부를 시작할 때 가장 먼저 만나는 것은 배열이나 리스트입니다. 언어마다 이름과 특징이 조금 다르지만, 쉽게 말하면 여러 값을 순서대로 담는 공간입니다.
예를 들어 학생들의 점수를 저장한다고 생각해보겠습니다. 점수가 90점, 80점, 75점, 100점이라면 이것들을 하나의 목록으로 묶어둘 수 있습니다. 파이썬에서는 리스트를 사용하고, 자바스크립트에서는 배열을 사용해 이런 값을 저장할 수 있습니다.
배열이나 리스트의 장점은 순서가 있다는 것입니다. 첫 번째 값, 두 번째 값, 세 번째 값처럼 위치를 기준으로 데이터를 꺼낼 수 있습니다. 그래서 여러 데이터를 차례대로 처리할 때 많이 사용됩니다.
저는 처음 리스트를 배울 때 단순히 여러 값을 넣어두는 상자 정도로만 생각했습니다. 그런데 반복문과 함께 사용하면서 중요성을 제대로 느꼈습니다. 이름 목록을 하나씩 출력하거나, 점수 목록의 평균을 구하거나, 상품 가격을 모두 더하는 작업이 훨씬 간단해졌습니다. 만약 리스트가 없다면 값을 하나하나 변수로 따로 만들어야 해서 코드가 금방 지저분해졌을 것입니다.
스택은 나중에 넣은 것을 먼저 꺼낸다
스택은 자료구조를 공부할 때 자주 나오는 개념입니다. 이름은 낯설지만 실생활 예시로 보면 어렵지 않습니다. 접시를 쌓아두는 모습을 떠올리면 됩니다. 접시를 하나씩 위에 올려두면, 나중에 올린 접시를 먼저 꺼내게 됩니다.
이처럼 스택은 나중에 들어온 데이터가 먼저 나가는 구조입니다. 영어로는 LIFO라고 부르기도 합니다. Last In, First Out의 줄임말인데, 마지막에 들어온 것이 먼저 나간다는 뜻입니다.
코딩에서는 되돌리기 기능을 생각하면 이해하기 쉽습니다. 문서 편집기에서 글을 쓰다가 Ctrl+Z를 누르면 가장 최근에 한 작업부터 되돌아갑니다. 가장 오래전에 한 작업이 아니라, 방금 한 작업부터 취소됩니다. 이런 흐름이 스택과 비슷합니다.
처음 스택 문제를 풀 때 저는 괄호 검사 예제를 통해 이해했습니다. 여는 괄호가 나오면 스택에 넣고, 닫는 괄호가 나오면 가장 최근의 여는 괄호와 짝이 맞는지 확인하는 방식이었습니다. 처음에는 복잡해 보였지만, “가장 최근에 들어온 것을 먼저 확인한다”는 원리를 알고 나니 훨씬 쉬워졌습니다.
큐는 먼저 들어온 것을 먼저 처리한다
큐는 스택과 반대 느낌으로 이해하면 좋습니다. 큐는 먼저 들어온 데이터가 먼저 나가는 구조입니다. 은행 창구나 카페 줄을 생각하면 쉽습니다. 먼저 줄을 선 사람이 먼저 주문하고, 나중에 온 사람은 뒤에서 기다립니다.
큐는 FIFO 구조라고 부릅니다. First In, First Out의 줄임말로, 먼저 들어온 것이 먼저 나간다는 뜻입니다.
코딩에서 큐는 순서대로 처리해야 하는 작업에 자주 사용됩니다. 예를 들어 프린터 대기열을 생각해볼 수 있습니다. 먼저 인쇄 요청을 보낸 문서가 먼저 출력되고, 뒤에 보낸 문서는 차례를 기다립니다. 이런 구조는 큐와 비슷합니다.
알고리즘에서는 BFS라는 그래프 탐색을 배울 때 큐가 자주 등장합니다. 처음에는 BFS라는 말이 어렵지만, 가까운 곳부터 차례대로 확인하는 방식이라고 생각하면 됩니다. 이때 먼저 발견한 대상을 먼저 처리하기 위해 큐를 사용합니다.
저는 처음에 스택과 큐가 자주 헷갈렸습니다. 둘 다 데이터를 넣고 빼는 구조인데 무엇이 다른지 잘 기억이 안 났습니다. 그때 접시 더미는 스택, 줄 서기는 큐라고 외우니 훨씬 쉽게 구분됐습니다.
해시는 빠르게 찾기 위한 자료구조
해시는 처음 들으면 조금 어려운 단어처럼 느껴집니다. 하지만 쉽게 말하면 이름표를 붙여서 값을 빠르게 찾는 방식이라고 볼 수 있습니다. 파이썬의 딕셔너리, 자바스크립트의 객체나 Map을 떠올리면 이해하기 쉽습니다.
예를 들어 학생 이름과 점수를 저장한다고 해보겠습니다. “민수는 90점”, “지영은 85점”, “현우는 78점”처럼 이름과 점수가 짝을 이룹니다. 이때 이름을 기준으로 점수를 빠르게 찾고 싶다면 해시 구조가 유용합니다.
리스트에서는 원하는 값을 찾기 위해 앞에서부터 하나씩 확인해야 할 수 있습니다. 하지만 해시를 사용하면 키를 통해 바로 값을 찾을 수 있습니다. 그래서 검색, 중복 확인, 개수 세기 같은 문제에서 자주 사용됩니다.
저는 알고리즘 문제를 풀다가 해시의 편리함을 크게 느꼈습니다. 처음에는 중복된 숫자가 있는지 확인하려고 리스트를 계속 반복해서 비교했습니다. 그런데 딕셔너리나 집합을 사용하니 훨씬 간단하게 해결됐습니다. 그때 자료구조를 잘 고르면 코드 길이뿐 아니라 생각하는 방식도 달라진다는 걸 알게 됐습니다.
트리와 그래프는 관계를 표현할 때 사용한다
자료구조를 조금 더 공부하면 트리와 그래프가 나옵니다. 이때부터 갑자기 난도가 올라간 것처럼 느껴질 수 있습니다. 하지만 개념 자체를 실생활로 보면 그렇게 낯설지만은 않습니다.
트리는 나무처럼 가지가 뻗어나가는 구조입니다. 회사 조직도나 가족 관계도를 생각하면 됩니다. 가장 위에 대표가 있고, 그 아래 팀장이 있고, 그 아래 팀원이 있는 식입니다. 컴퓨터 폴더 구조도 트리와 비슷합니다. 큰 폴더 안에 작은 폴더가 있고, 그 안에 파일이 들어갑니다.
그래프는 여러 대상이 서로 연결된 구조입니다. 지하철 노선도, 친구 관계, 지도 경로를 떠올리면 됩니다. 어떤 역과 어떤 역이 연결되어 있는지, 어떤 사람과 어떤 사람이 친구인지 표현할 때 그래프를 사용할 수 있습니다.
처음부터 트리와 그래프 문제를 깊게 풀 필요는 없습니다. 하지만 이런 구조가 있다는 것을 알아두면 나중에 알고리즘 공부를 할 때 훨씬 덜 낯설게 느껴집니다. 특히 DFS, BFS 같은 탐색 알고리즘은 트리와 그래프를 이해해야 자연스럽게 받아들일 수 있습니다.
자료구조는 문제에 맞게 고르는 것이 핵심이다
자료구조 공부에서 중요한 것은 각각의 이름을 외우는 것이 아닙니다. 더 중요한 것은 상황에 맞는 자료구조를 고르는 능력입니다.
여러 데이터를 순서대로 처리해야 한다면 리스트나 배열이 어울릴 수 있습니다. 가장 최근에 넣은 데이터를 먼저 꺼내야 한다면 스택이 좋습니다. 먼저 들어온 데이터를 먼저 처리해야 한다면 큐가 맞습니다. 특정 값을 빠르게 찾거나 중복을 확인해야 한다면 해시가 유용합니다. 관계나 연결 구조를 표현해야 한다면 트리나 그래프를 생각해볼 수 있습니다.
처음에는 이 판단이 바로 되지 않습니다. 저도 문제를 풀 때마다 “이걸 리스트로 풀어야 하나, 딕셔너리로 풀어야 하나?” 하고 오래 고민했습니다. 그런데 비슷한 문제를 반복해서 풀다 보니 조금씩 감이 생겼습니다. 중복 확인이라는 말이 나오면 해시를 떠올리고, 괄호나 되돌리기 느낌이 나오면 스택을 떠올리는 식입니다.
처음 공부할 때 추천하는 순서
자료구조를 처음 공부한다면 배열과 리스트부터 시작하는 것이 좋습니다. 가장 자주 쓰이고, 반복문과 함께 사용하기 좋기 때문입니다. 그다음 문자열과 해시를 공부하면 좋습니다. 문자열 처리와 딕셔너리 활용은 초급 문제에서도 자주 나옵니다.
이후에는 스택과 큐를 배우면 됩니다. 두 자료구조는 구조가 단순하면서도 알고리즘 문제에서 자주 등장합니다. 괄호 문제, 기능 처리 문제, 대기열 문제 등을 풀면서 익히기 좋습니다.
그다음 트리와 그래프를 가볍게 접하고, DFS와 BFS로 연결하면 됩니다. 처음부터 모든 개념을 완벽히 이해하려고 하지 않아도 됩니다. 간단한 예제와 그림을 통해 구조를 먼저 이해하고, 문제를 풀면서 천천히 익히면 됩니다.
자료구조는 눈으로 설명만 읽으면 쉽게 잊어버립니다. 직접 데이터를 넣고, 꺼내고, 출력해보는 연습이 필요합니다. 특히 작은 예제를 만들어보면 훨씬 오래 기억에 남습니다.
그림으로 그리면 훨씬 쉬워진다
자료구조가 어렵게 느껴지는 이유 중 하나는 머릿속으로만 생각하기 때문입니다. 스택, 큐, 트리, 그래프는 그림으로 그려보면 훨씬 쉽게 이해됩니다.
스택은 위로 쌓이는 박스로 그릴 수 있고, 큐는 줄 서 있는 사람들처럼 그릴 수 있습니다. 트리는 위에서 아래로 뻗어가는 가지 모양으로 그릴 수 있고, 그래프는 점과 선으로 연결해볼 수 있습니다.
저는 처음에 그래프 문제를 코드로만 보다가 전혀 이해하지 못했습니다. 그런데 노드와 간선을 직접 종이에 그려보니 문제가 훨씬 쉽게 보였습니다. 어떤 지점에서 어디로 갈 수 있는지 눈에 보이니 DFS와 BFS의 차이도 조금씩 이해됐습니다.
코딩 공부라고 해서 항상 컴퓨터 앞에서만 해야 하는 것은 아닙니다. 오히려 자료구조와 알고리즘은 종이에 그려보는 시간이 큰 도움이 됩니다. 손으로 구조를 그려보고, 데이터가 어떤 순서로 들어가고 나오는지 화살표로 표시해보면 개념이 훨씬 선명해집니다.
자료구조를 알면 코드가 달라진다
자료구조를 공부하면 처음에는 용어가 많아 어렵게 느껴집니다. 하지만 조금씩 익히다 보면 코드를 바라보는 방식이 달라집니다. 단순히 “어떻게든 작동하게 만들기”에서 벗어나 “어떤 방식으로 데이터를 담아야 더 깔끔할까?”를 생각하게 됩니다.
자료구조는 데이터를 담는 그릇입니다. 배열과 리스트는 순서 있는 데이터를 관리하기 좋고, 스택은 나중에 넣은 것을 먼저 꺼낼 때 유용합니다. 큐는 먼저 들어온 것을 먼저 처리할 때 사용하고, 해시는 값을 빠르게 찾거나 중복을 확인할 때 좋습니다. 트리와 그래프는 계층이나 연결 관계를 표현할 때 필요합니다.
처음부터 모든 자료구조를 완벽히 외우려고 하지 않아도 됩니다. 중요한 것은 쉬운 예제를 통해 직접 사용해보는 것입니다. 리스트로 점수 평균을 구해보고, 스택으로 괄호를 검사해보고, 큐로 대기열을 만들어보고, 해시로 이름별 점수를 찾아보면 됩니다.
저도 처음에는 자료구조가 너무 이론처럼 느껴졌습니다. 그런데 직접 문제를 풀면서 “아, 이럴 때 스택을 쓰는구나”, “이래서 딕셔너리가 편하구나”를 경험하니 훨씬 자연스럽게 이해됐습니다. 자료구조는 외우는 지식이 아니라 써보면서 몸에 익히는 도구입니다.
코딩 실력을 키우고 싶다면 자료구조를 너무 멀리하지 않는 것이 좋습니다. 어렵게 시작할 필요는 없습니다. 오늘은 리스트 하나를 제대로 써보고, 내일은 딕셔너리로 값을 찾아보고, 그다음 스택과 큐를 작은 예제로 연습해보면 됩니다. 그렇게 하나씩 쌓다 보면 알고리즘 문제도, 실제 프로젝트 코드도 조금씩 더 명확하게 보이기 시작할 것입니다.