자료구조 선택 가이드: 연산 비용으로 배열·스택·큐·Set 고르기

2026.09.10·수정 2026.09.13·약 7분·작성: 해비·블로그 소개

자료구조는 “무엇을 먼저 꺼낼까?”에서 고릅니다

이름부터 외우지 않아도 됩니다. 실제로 자주 할 동작을 하나 고르면 배열·스택·큐·Map·Set 중 알맞은 출발점이 보입니다.

자료구조 선택의 핵심 구조를 표현한 개념 표지

1. 오늘 처리할 일 세 개가 있습니다

자료구조는 여러 값을 담아 두고, 필요할 때 찾거나 꺼내기 위한 정리 방식입니다. 특별한 계산부터 배우는 것이 아니라, 같은 목록을 어떤 규칙으로 다룰지 고르는 일에서 시작합니다.

아침에 일이 다음 순서로 들어왔다고 해보겠습니다.

들어온 순서 할 일
1 메일 답장
2 회의 자료
3 버그 확인

같은 세 항목도 어떤 것을 먼저 꺼내려는지에 따라 알맞은 구조가 달라집니다.

내가 원하는 동작 먼저 꺼낼 값 출발점
두 번째 일을 바로 보고 싶다 회의 자료 배열
방금 넣은 일을 먼저 되돌린다 버그 확인 스택
먼저 들어온 일을 먼저 처리한다 메일 답장

배열은 각 칸에 0, 1, 2처럼 번호가 있습니다. 스택은 접시를 쌓듯 마지막에 올린 것을 먼저 꺼냅니다. 큐는 줄을 서듯 먼저 들어온 것을 먼저 꺼냅니다. 지금은 어려운 용어보다 이 꺼내는 순서만 기억하면 충분합니다.

2. 손으로 한 번 따라가 봅니다

할 일이 하나씩 들어올 때 모습을 적어보겠습니다.

단계 저장된 값 다음에 꺼낼 값
메일 답장 추가 [메일 답장] 메일 답장
회의 자료 추가 [메일 답장, 회의 자료] 큐: 메일 답장 / 스택: 회의 자료
버그 확인 추가 [메일 답장, 회의 자료, 버그 확인] 큐: 메일 답장 / 스택: 버그 확인
배열의 1번 칸 조회 변화 없음 회의 자료

저장된 값은 같지만 질문이 다릅니다. “몇 번 칸인가?”, “가장 최근인가?”, “가장 먼저인가?” 중 무엇을 자주 묻는지가 선택 기준입니다.

3. 가장 짧은 코드로 순서를 확인합니다

아래 예제는 각각 브라우저 개발자 도구의 Console에 붙여 넣어 실행할 수 있습니다. console.log는 결과를 출력합니다. 같은 예제를 다시 실행할 때 변수 이름이 이미 선언되었다는 오류가 나오면 새로고침 후 실행하세요.

const tasks = ['메일 답장', '회의 자료', '버그 확인'];

console.log(tasks[1]);
console.log(tasks[tasks.length - 1]);
console.log(tasks[0]);
회의 자료
버그 확인
메일 답장

첫 줄은 세 값을 순서대로 배열에 담습니다. tasks[1]은 1번 칸을 읽습니다. 번호는 0부터 세므로 두 번째 값입니다. tasks.length - 1은 마지막 칸의 번호라서 가장 최근에 넣은 값을 읽습니다. tasks[0]은 가장 먼저 들어온 값입니다. 아직 값을 지우지 않았기 때문에 세 줄을 실행해도 배열은 그대로입니다.

작은 확인 문제: 새 일은 어디에서 꺼낼까요?

“전화하기”를 마지막에 추가했습니다. 최근 작업부터 되돌린다면 무엇을 먼저 꺼내야 할까요?

const work = ['메일', '회의', '전화하기'];
console.log(work[work.length - 1]);
전화하기

정답은 “전화하기”입니다. 마지막에 들어온 값을 먼저 꺼내므로 스택의 순서입니다.

4. 이름표로 자주 찾는다면 Map입니다

set은 ID 이름표와 값을 함께 저장하고, get은 그 이름표로 값을 읽습니다.

const byId = new Map();
byId.set('u1', '민수');
byId.set('u2', '수지');

console.log(byId.get('u2'));
console.log(byId.get('u9'));
수지
undefined

빈 Map을 만들고 두 이름표를 저장했습니다. u2로 읽으면 수지가 나오고, 저장하지 않은 u9로 읽으면 undefined가 나옵니다. 이 글에서는 선택 기준만 익힙니다. 자세한 메서드는 Map·Set 상세 글에서 이어집니다.

더 알아보기: ID가 겹치거나 회원이 바뀌면?

같은 ID로 set을 두 번 실행하면 나중 값이 앞 값을 덮어씁니다. ID는 겹치지 않는다는 규칙을 정하거나 저장 전에 확인해야 합니다. 별도의 회원 배열을 바꿔도 이미 만든 Map은 저절로 갱신되지 않으므로 회원 추가나 ID 변경 때 함께 고쳐야 합니다.

5. 중복을 한 번만 남기려면 Set입니다

const tags = ['자바스크립트', '배열', '자바스크립트'];
const tagSet = new Set(tags);
const uniqueTags = Array.from(tagSet);
console.log(uniqueTags.join(', '));
자바스크립트, 배열

첫 줄에는 자바스크립트가 두 번 있습니다. Set이 같은 값을 한 번만 남기고, Array.from이 다시 배열로 바꿉니다. 마지막 줄은 두 값을 쉼표로 이어 출력합니다. 등장 횟수까지 세어야 한다면 Set만으로는 부족합니다.

6. 선택표는 마지막에 확인합니다

가장 자주 할 일 먼저 살펴볼 구조 주의할 점
번호로 읽고 끝에 추가 Array 중간 삭제 때 뒤 값의 번호가 바뀜
최근 값을 먼저 꺼냄 Stack 중간 값 검색용은 아님
먼저 온 값을 먼저 꺼냄 Queue 대량 처리에서는 앞 삭제 비용도 확인
ID 같은 키로 반복 조회 Map 중복 키와 갱신 규칙 필요
중복을 한 번만 보관 Set 등장 횟수는 따로 세어야 함
알고 있는 노드 사이의 연결 변경 연결 리스트 노드를 찾는 일은 처음부터 순회

처음에는 계산식보다 문장으로 선택해 보세요. “나는 먼저 온 일을 먼저 꺼낸다”라고 말할 수 있으면 큐를 고를 근거가 생긴 것입니다.

더 알아보기: 값이 많아지면 비용도 비교합니다

값이 몇 개 없을 때는 이해하기 쉬운 구조로 시작해도 됩니다. 값이 많아지면 한 번 처리할 때 몇 칸을 확인하는지 살펴봅니다. 배열에서 ID를 찾으면 여러 회원을 차례로 확인할 수 있지만, Map은 ID로 찾는 일을 반복하기 좋습니다. 배열 가운데를 지우면 뒤의 여러 값이 이동할 수 있습니다. 이처럼 “몇 번 찾는가?”와 “값이 얼마나 많아지는가?”를 함께 보는 것이 연산 비용으로 고르는 방법입니다.

7. 다음 글과 연습

기존 문제 배열에서 최솟값 찾기를 풀며 “모든 값을 한 번씩 확인해야 하는가?”를 생각해 보세요.

참고 자료

공식 문서 확인일: 2026년 9월 10일.

직접 실습: 연산 비용으로 구조를 설명합니다

실습 주제: 자료구조 선택 가이드: 연산 비용으로 배열·스택·큐·Set 고르기

  1. 본문 구현에서 저장되는 값과 연결 관계를 그림으로 적습니다.
  2. 조회·삽입·삭제 중 이 구조가 가장 자주 수행할 연산을 고릅니다.
  3. 연산 전후에도 유지되어야 하는 규칙을 한 문장으로 적습니다.
  4. 배열이나 Map 같은 다른 구조로 바꿨을 때 시간·공간 비용을 비교합니다.
풀이 기준과 확인 결과

메서드 이름만 외우지 말고 한 번의 연산에서 어떤 값과 연결이 바뀌는지 추적하세요. 빈 구조, 원소 한 개, 중복값, 연속 삽입·삭제를 실행했을 때 본문이 설명한 불변식이 유지되면 성공입니다.

테스트 체크리스트

  • 빈 구조에 대한 조회·삭제 처리
  • 첫 원소와 마지막 원소 변경
  • 중복값 또는 동일 우선순위 처리
  • 입력 크기가 커졌을 때 예상 복잡도 유지

이 글이 도움이 되었나요?

조회 중

자료구조 학습 순서

필수 18개 · 전체 18개

읽음 기록 관리

전체 과정 목차 (18개)
  1. 필수 학습 · 자료구조 선택 가이드: 연산 비용으로 배열·스택·큐·Set 고르기 현재 글
  2. 필수 학습 · JavaScript 배열: 인덱스 조회와 삽입·삭제 비용
  3. 필수 학습 · JavaScript Map·Set: 값 조회와 중복 제거 실습
  4. 필수 학습 · 자료구조 스택 쉽게 이해하기: push pop으로 문제 풀이 감 잡기
  5. 필수 학습 · 큐와 FIFO: head 인덱스로 JavaScript 대기열 만들기
  6. 필수 학습 · 단방향 연결 리스트: head·tail 삽입과 삭제
  7. 필수 학습 · JavaScript 원형 덱 구현: 양끝 삽입·삭제와 고정 용량 버퍼
  8. 필수 학습 · JavaScript 문자열 해시 테이블 구현: 충돌 처리와 리사이즈, NFC 정규화
  9. 필수 학습 · 트리 자료구조 차이: 이진 트리 BST MST 구분하기
  10. 필수 학습 · JavaScript 이진 탐색 트리 구현: 중복 키와 세 가지 삭제 처리
  11. 필수 학습 · JavaScript 최소 힙 구현: 우선순위 큐의 push·pop과 비교 함수
  12. 필수 학습 · JavaScript 그래프 구현: 인접 리스트·인접 행렬 비교와 BFS
  13. 필수 학습 · JavaScript Union-Find: 경로 압축과 크기 합치기로 연결 상태 관리하기
  14. 필수 학습 · JavaScript Trie: Unicode 접두사 검색과 안전한 삭제 구현
  15. 필수 학습 · JavaScript Fenwick Tree: lowbit로 구간 합과 단일 증가 갱신 구현
  16. 필수 학습 · JavaScript 반복형 세그먼트 트리: 구간 합·단일 대입·결합 순서
  17. 필수 학습 · JavaScript LRU 캐시: Map과 이중 연결 리스트의 불변식
  18. 필수 학습 · JavaScript AVL 트리: 높이 불변식과 LL·RR·LR·RL 삽입 회전

새 글 받아보기

RSS 리더에서 BlogFlow의 새 글을 확인할 수 있습니다.

RSS 피드 구독하기

댓글 남기기