어제 Computational Thinking으로 “문제를 어떻게 분석할 것인가”를 배웠다면, 오늘은 “데이터를 어떻게 담을 것인가”를 배우는 날이었다. 자료구조는 처음엔 단순해 보이지만, 실제로는 모든 알고리즘의 기초가 되는 중요한 개념이다.
오늘 다룬 범위
- 배열과 리스트의 개념 및 차이
- 스택(Stack): LIFO 구조와 활용
- 큐(Queue): FIFO 구조와 활용
- 트리(Tree), 그래프(Graph), 힙(Heap) 개론
- 각 자료구조를 왜 사용해야 하는가
핵심 개념 정리
자료구조는 왜 필요할까?
강사님이 첫 시간에 던진 질문이 인상적이었다.
“같은 데이터 10개를 저장하는데, 어떤 순서로 꺼낼 예정인가에 따라 저장하는 방식을 달라해야 한다.”
이 문장이 자료구조의 모든 것을 설명하고 있었다. 데이터를 “효율적으로” 다루기 위해서는 어떤 작업을 자주 할 것인지를 먼저 생각해야 한다는 뜻이다.
스택(Stack) - 접시 쌓기처럼
LIFO(Last In First Out) 구조다. 마지막에 들어온 데이터가 가장 먼저 나간다.
push: 데이터 추가
pop: 가장 위의 데이터 꺼냄
top: 현재 가장 위의 위치
실제 예시:
- 브라우저 뒤로가기: 방문한 페이지를 스택에 저장하고, 뒤로가기를 누르면 가장 최근 페이지부터 나온다
- 함수 호출: 프로그램이 함수를 부를 때 콜스택에 함수를 쌓고, 함수가 끝나면 위에서부터 하나씩 제거한다
- 실행 취소(Undo): 가장 최근 작업부터 취소된다
큐(Queue) - 줄 서기처럼
FIFO(First In First Out) 구조다. 먼저 들어온 데이터가 먼저 나간다.
enqueue: 뒤에 데이터 추가
dequeue: 앞의 데이터 꺼냄
front/rear: 앞과 뒤의 위치
실제 예시:
- 은행 번호표: 먼저 받은 번호가 먼저 호출된다
- 프린터 출력 대기열: 먼저 출력한 문서가 먼저 나온다
- 웹 서버 요청 처리: 들어온 순서대로 처리한다
트리와 그래프로 향하며
트리는 “계층 구조”를 나타낸다. 회사 조직도, 파일 시스템 폴더 구조가 트리 구조다. 특히 이진 트리와 힙은 정렬이나 우선순위 처리에 자주 사용된다.
그래프는 “관계”를 나타낸다. SNS 팔로우 관계, 도시 간의 도로 연결, 추천 시스템 등이 모두 그래프 문제다.
헷갈렸던 점 / 실수 포인트
”근데 배열이면 되지 않나?”
처음엔 정말 이 생각을 했다. “배열이 있는데 왜 스택이나 큐 같은 걸 따로 배우지?” 하면서.
하지만 강사님의 설명을 들으며 깨달았다. 배열은 어떤 위치의 데이터든 접근할 수 있지만, 스택과 큐는 특정 방식으로만 접근한다. 이건 제약처럼 보이지만 실제로는 특정 문제에 최적화된 도구라는 뜻이다.
예를 들어:
- 브라우저 뒤로가기를 배열로 구현한다면, 모든 페이지 기록을 관리하고, 항상 마지막 항목만 꺼내야 한다.
- 하지만 스택으로 구현하면, 구조 자체가 “마지막 것부터 꺼낸다”는 의미를 담고 있어서 코드가 간단하고 실수가 적다.
구조가 의미를 담고 있다. 이게 자료구조를 배우는 핵심 이유다.
”힙은 왜 트리 모양이야?”
힙(Heap)을 배워본 순간 또 다른 깨달음이 있었다. 힙은 단순히 “최댓값이나 최솟값을 빠르게 찾기 위한” 구조인데, 왜 하필 트리일까?
완전 이진 트리 구조를 사용하면:
- 데이터 추가/제거 시 부모-자식 관계만 확인하면 된다
- 배열에 넣으면 인덱스 계산만으로 부모/자식을 찾을 수 있다
- 결과적으로 O(log n) 시간에 최댓값을 찾을 수 있다
만약 “최댓값을 빠르게 찾고 싶다”는 요구사항만 보면 배열을 정렬하면 되지 않을까? 맞다. 하지만 자주 추가/삭제를 하면서 최댓값을 찾아야 한다면 힙이 훨씬 효율적이다.
이것도 상황에 따른 최적의 구조를 선택하는 것이 자료구조의 핵심이라는 걸 보여준다.
복습 Q&A
Q. 스택과 큐의 차이를 쉽게 기억하는 방법?
A. 스택 = 식당 접시 (깨끗한 접시는 위에 쌓이고, 사용할 때도 위에서 꺼낸다)
큐 = 버스 탈 때 줄 (먼저 선 사람이 먼저 탄다)
이 두 이미지를 머릿속에 두면 자동으로 LIFO, FIFO가 떠올라진다.
Q. 배열과 연결리스트는 뭐가 다른가?
A.
- 배열: 메모리에 연속된 공간에 데이터를 저장. 접근은 빠르지만(O(1)), 삽입/삭제는 느리다(O(n))
- 연결리스트: 각 데이터가 다음 데이터의 주소를 가리킨다. 접근은 느리지만(O(n)), 삽입/삭제는 빠르다(O(1))
상황:
- “특정 위치의 데이터를 자주 조회한다” → 배열
- “자주 삽입/삭제한다” → 연결리스트
Q. 자료구조를 배우는 것과 알고리즘의 관계는?
A. 분리할 수 없는 관계다.
자료구조 = 데이터를 담는 그릇 알고리즘 = 그릇 속의 데이터를 다루는 방법
예를 들어, 우선순위 큐(Priority Queue)는 자료구조이면서, 동시에 “힙을 이용해서 최댓값을 O(log n)에 꺼내는 알고리즘”을 포함하고 있다.
자료구조를 제대로 이해해야만 효율적인 알고리즘을 짤 수 있다.
한 줄 정리
자료구조는 문제의 특성에 맞는 데이터 보관 방법이다. 같은 데이터도 어떻게 조직하느냐에 따라 처리 속도가 10배, 100배 달라진다.
내일은 알고리즘의 기초를 배운다. 자료구조로 “어떻게 담을 것인가”를 배웠으니, 내일은 “어떻게 처리할 것인가”를 배우게 될 것 같다.
Community
Comments
Comments appear immediately. Use report if something needs review.
No comments yet.