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

··설명 약 9분·작성: 해비·블로그 소개

읽기 전에 알아두면 좋아요

아래 개념이 익숙하면 본문을 바로 읽으세요. 낯선 개념만 링크에서 복습하면 됩니다.

개념과 예제는 실행하지 않아도 읽을 수 있습니다. 내 컴퓨터·터미널에서 직접 실행하는 과정은 선택 실습입니다.

과정 위치와 선택 복습 안내

과정 위치: 자료구조 개념과 문제 · 자료구조 개념

과정 위치는 이 글이 속한 묶음입니다. 이 단계의 모든 개념을 먼저 읽을 필요는 없습니다. 위에 연결한 개념 중 낯선 내용만 복습하세요. 문제의 조건·상태·갱신 순서는 익숙한 언어로 설명하면 됩니다.

JavaScript로 문법·실행 복습하기 (선택)

개념 글의 코드는 JavaScript 예시입니다. 문제 화면에서는 JavaScript·Python·Java·C++·C# 중 익숙한 언어의 함수를 작성하세요. 본문의 Node.js 입출력 예시는 로컬 실행을 위한 별도 안내입니다.

배열·스택·큐·Map·Set은 자주 하는 연산에 따라 어떻게 선택하나요?

자료구조는 자주 할 동작을 기준으로 고릅니다. 순서대로 읽기는 배열, 마지막 값부터 꺼내기는 스택, 먼저 온 값부터 처리는 큐, 키 조회와 중복 확인은 Map·Set에서 시작합니다.

적용 조건·범위: 검증 범위: 위 독립 예제의 출력만 로컬에서 확인했습니다. 이 글은 독립 자료구조 실습입니다. 실제 브라우저 표시와 모든 입력·플랫폼의 실행은 검증하지 않았습니다.

본문 근거: ECMAScript Map Objects

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

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

반복할 동작인 번호 조회·최근 값·먼저 온 값·키 조회·중복 제거를 Array·Stack·Queue·Map·Set으로 연결하는 선택 흐름
이름을 외우기 전에 가장 자주 수행할 동작을 고릅니다. 이 그림은 출발점을 고르는 기준이며, 실제 구현의 시간과 메모리 비용은 해당 연산별로 확인해야 합니다. 원본 보기 (새 탭)
자료구조 선택의 핵심 구조를 표현한 개념 표지

선수 지식: JavaScript 변수·배열·조건문을 먼저 익힙니다. 객체 참조나 함수가 낯설면 아래 단계별 예제부터 시작하고, class 전체 구현은 해당 동작을 손으로 추적한 뒤 읽습니다. 각각의 코드는 독립 실행합니다.

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

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

메일 답장·회의 자료·버그 확인 목록에서 배열 두 번째·스택 최근·큐 최초 기준으로 다른 값을 고르는 비교
저장된 세 값은 같아도 질문에 따라 선택이 달라집니다. 배열의 두 번째 칸은 회의 자료, 최근 작업은 버그 확인, 먼저 들어온 작업은 메일 답장입니다. 원본 보기 (새 탭)

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

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

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

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

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

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

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

작업을 하나씩 추가할 때 큐의 다음 값은 메일 답장이고 스택의 다음 값은 새 마지막 작업으로 바뀌는 세 상태
이 그림은 항목을 꺼내지 않고 다음에 고를 값만 비교합니다. 메일 답장 뒤에 회의 자료와 버그 확인을 넣을수록 스택의 다음 값은 달라지고 큐의 다음 값은 유지됩니다. 원본 보기 (새 탭)
단계 저장된 값 다음에 꺼낼 값
메일 답장 추가 [메일 답장] 메일 답장
회의 자료 추가 [메일 답장, 회의 자료] 큐: 메일 답장 / 스택: 회의 자료
버그 확인 추가 [메일 답장, 회의 자료, 버그 확인] 큐: 메일 답장 / 스택: 버그 확인
배열의 1번 칸 조회 변화 없음 회의 자료

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

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

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

메일·회의·전화하기 배열에서 work.length−1 위치를 읽을 때의 값을 묻는 초기 문제
예제의 값과 인덱스만 보고 work[work.length−1]이 가리키는 값을 직접 적어 보세요. 그림에는 선택된 칸이나 출력 답을 표시하지 않았습니다. 원본 보기 (새 탭)
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은 그 이름표로 값을 읽습니다.

u1은 민수, u2는 수지인 Map에서 u2 조회는 수지, 등록되지 않은 u9 조회는 undefined가 되는 대응
Map은 이름표인 키로 저장된 값을 찾습니다. u9는 엔트리에 추가된 값이 아니라 등록되지 않은 키의 조회이며 결과는 undefined입니다. 원본 보기 (새 탭)
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입니다

자바스크립트·배열·자바스크립트 태그에서 중복을 합쳐 자바스크립트·배열 순서로 남기는 Set과 배열 변환
두 자바스크립트 태그는 Set의 같은 값 하나로 합쳐집니다. Array.from으로 바꾼 결과도 자바스크립트·배열 순서이며 등장 횟수는 따로 저장하지 않습니다. 원본 보기 (새 탭)
const tags = ['자바스크립트', '배열', '자바스크립트'];
const tagSet = new Set(tags);
const uniqueTags = Array.from(tagSet);
console.log(uniqueTags.join(', '));
자바스크립트, 배열

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

바로 실행해 보는 핵심 예제

독자 질문: 작업 순서를 유지하면서 중복 항목을 골라내려면 무엇을 고르나요?

A·B·A 작업 순서를 유지하는 배열 복사와 Set으로 유일한 제목 수를 구하는 두 빈 답 영역
입력 작업은 A·B·A입니다. 작업 목록을 그대로 보이는 결과와 중복을 한 번만 세는 제목 수를 따로 구해 보세요. 원본 보기 (새 탭)

왜 쓰나요? 순서가 필요한 목록은 배열, 같은 값의 중복 여부만 확인할 때는 Set을 함께 쓰면 역할이 분명합니다.

아래 바닐라 JavaScript 코드는 독립 실행 예제입니다. 본문에서 배운 개념을 새 데이터로 확인합니다. 다른 예제와 같은 콘솔에 이어 붙이지 말고 새 콘솔 또는 새 .cjs 파일에서 실행하세요.

const tasks = ["A", "B", "A"];
const ordered = [...tasks];
const unique = new Set(tasks);
console.log(ordered.join(","), [...unique].join(","));

실행 결과와 비용

이번 검토에서는 Node.js v24.18.0에서 위 독립 예제를 실행해 다음 출력과 일치하는지 확인했습니다.

A,B,A A,B

시간·공간 복잡도: 배열 복사는 O(n)입니다. Set 생성은 일반적인 해시 기반 구현에서 평균 O(n) 시간·O(n) 추가 공간, 항목 포함 확인은 보통 평균 O(1)입니다. JavaScript 표준은 특정 해시 구현을 강제하지 않습니다.

직접 풀 문제

작업 순서 A, B, A를 그대로 보이면서 유일한 제목 수를 구해 보세요.

풀이와 기대 결과

ordered는 A,B,A를 유지하고 unique.size는 2입니다. Set을 목록 자체로 대체하면 중복 작업이 사라집니다.

원자료의 다른 학습 순서 (선택)

자료구조 과정 원래 순서의 다음 글: 02 배열의 위치별 읽기·삽입·삭제 비용

검증 범위: 위 독립 예제의 출력만 로컬에서 확인했습니다. 이 글은 독립 자료구조 실습입니다. 실제 브라우저 표시와 모든 입력·플랫폼의 실행은 검증하지 않았습니다.

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

배열 가운데 회의 자료를 지워 버그 확인이 인덱스 2에서 1로 이동하는 모습과 Map u2 조회 결과 수지 비교
배열 가운데를 지우면 뒤 값의 번호가 달라집니다. Map의 키 조회와 비교할 때는 반환값뿐 아니라 반복 횟수와 한 번에 바뀌는 칸도 함께 살펴보세요. 원본 보기 (새 탭)
가장 자주 할 일 먼저 살펴볼 구조 주의할 점
번호로 읽고 끝에 추가 Array 중간 삭제 때 뒤 값의 번호가 바뀜
최근 값을 먼저 꺼냄 Stack 중간 값 검색용은 아님
먼저 온 값을 먼저 꺼냄 Queue 대량 처리에서는 앞 삭제 비용도 확인
ID 같은 키로 반복 조회 Map 중복 키와 갱신 규칙 필요
중복을 한 번만 보관 Set 등장 횟수는 따로 세어야 함
알고 있는 노드 사이의 연결 변경 연결 리스트 노드를 찾는 일은 처음부터 순회

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

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

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

7. 다음 글과 연습

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

참고 자료

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

자료형·자료구조·연산 규칙을 나누어 고릅니다

숫자·문자열 같은 자료형은 다루는 값과 허용 연산을 정하고, 배열·연결 리스트 같은 자료구조는 여러 값을 저장하고 연결하는 방법을 정합니다. 스택의 LIFO나 큐의 FIFO는 값을 꺼내는 연산 규칙입니다. 따라서 “스택과 배열 중 하나”만 골라야 하는 것은 아닙니다. 배열 끝에서 넣고 꺼내는 스택도 있고 연결 노드를 앞에서 넣고 꺼내는 스택도 있습니다. 같은 규칙을 다른 저장 구조로 구현하면 연산 비용과 메모리 사용이 달라집니다.

문자열 작업을 최근부터 처리하는 스택 규칙 아래 배열 끝과 연결 노드 앞이라는 두 저장 구현
LIFO는 꺼내는 규칙이고 배열·연결 노드는 저장 방식입니다. 두 구현 모두 버그 확인을 다음으로 꺼내지만 저장 배치와 실제 비용은 따로 비교해야 합니다. 원본 보기 (새 탭)

예를 들어 되돌리기 기록은 가장 최근 작업부터 취소하므로 스택 규칙을 고르고, 그다음 배열 끝 연산과 연결 노드 구현 중 환경에 맞는 저장 방식을 선택합니다. Set의 중복 없는 집합 규칙도 해시 또는 순서 트리로 구현할 수 있습니다. “어떤 값을 저장할까 → 어떤 순서로 읽을까 → 어떤 연산이 반복될까”를 차례로 물으면 이름만 외워 선택하는 실수를 줄일 수 있습니다. 구현 이름만으로 모든 연산이 빠르다고 판단하지 말고, 자주 하는 연산의 조건과 최악 비용을 확인하세요.

이어서 공부할 개념

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

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

세 작업의 최근 작업부터 취소하기 요구를 보고 구조·유지 규칙·다른 저장 비용을 직접 적는 문제
입력 작업과 필요한 동작만 제시했습니다. 어떤 구조를 고를지, 어떤 순서를 유지할지, 다른 저장 방식의 비용은 어떨지 직접 적어 보세요. 원본 보기 (새 탭)
  1. 본문 구현에서 저장되는 값과 연결 관계를 그림으로 적습니다.
  2. 조회·삽입·삭제 중 이 구조가 가장 자주 수행할 연산을 고릅니다.
  3. 연산 전후에도 유지되어야 하는 규칙을 한 문장으로 적습니다.
  4. 배열이나 Map 같은 다른 구조로 바꿨을 때 시간·공간 비용을 비교합니다.
풀이 기준과 확인 결과

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

테스트 체크리스트

빈 구조, 첫 값과 마지막 값, A·B·A 중복 목록, n개 입력 비용으로 선택 규칙을 점검하는 네 시나리오
자료구조를 고른 뒤에는 경계 입력에서도 원하는 동작이 유지되는지 확인합니다. 중복을 보존할지 제거할지와 자주 할 연산을 먼저 적으면 비교 기준이 분명해집니다. 원본 보기 (새 탭)
  • 빈 구조에 대한 조회·삭제 처리
  • 첫 원소와 마지막 원소 변경
  • 중복값 또는 동일 우선순위 처리
  • 입력 크기가 커졌을 때 예상 복잡도 유지

이 글이 도움이 되었나요?

조회 중

이어서 공부하기

체크포인트: 예제의 상태 변화를 손으로 추적하고 아래 문제에 적용하세요. 값이 없는 경우와 원소 하나인 경우도 설명해 보세요. 삽입·제거 전후의 상태를 그리고, 내장 도구를 쓰는 풀이와 직접 구현의 목적을 구분하세요.

이 개념으로 더 풀어보기

다음 추천 · 자료구조 개념: JavaScript Map·Set: 값 조회와 중복 제거 실습

같은 주제에서 다음 개념과 예제로 이해를 넓힙니다.

복습 문제 보기 (선택)

앞에서 다룬 문제에 이 개념을 다시 적용해 보세요. 최솟값 구하기 풀이|배열 순회와 비교 갱신 원리

권장 순서는 학습 가이드와 같습니다. 다른 순서는 접힌 참고 목록에서 확인할 수 있습니다. 읽음 표시는 숙달이나 채점 결과가 아닙니다.

원래 과정 목록 순서 (선택)

읽음 기록

읽음 — / 전체 23개 · 필수 23개

이 글을 쓴 해비

웹사이트를 제작·운영하고, 개인 서비스와 자동화·AI 도구를 만듭니다. 직접 만들며 배운 내용과 문제 해결 과정을 BlogFlow에 기록합니다.

새 글 받아보기

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

RSS 피드 구독하기

댓글 남기기