| English | 의미 |
|---|---|
| queue/kjuː/ | 큐 |
| push/pʊʃ/ | 스택에 밀기 |
| abstract data type/ˈæbstrækt ˈdeɪtə taɪp/ | 추상 데이터 타입 |
| stack/stæk/ | 스택 |
| linked list/lɪŋkt lɪst/ | 연결 목록 |
| LIFO/ˈlaɪfəʊ/ | 후입 선출 |
| pop/pɒp/ | 스택에서 빼내기 |
| pointer/ˈpɔɪntə/ | 포인터 |
| FIFO/ˈfaɪfəʊ/ | 전입 후출 |
| enqueue/enˈkjuː/ | enqueue: 입구 |
| dequeue/diːˈkjuː/ | dequeue: 출구 |
| node/nəʊd/ | node: 노드 |
| traverse/trəˈvɜːs/ | traverse: 순회 |
뒤로 가기 버튼과 프린터 대기열
- 방문한 모든 페이지는 스택에 쌓입니다. 뒤로 가기 버튼은 최상단 요소를 제거합니다. 가장 최근에离开한 페이지가 먼저 되돌아옵니다.
- 복도 끝에 있는 프린터는 도착 순서대로 작업을 처리합니다. 처음 보낸 문서는 처음 출력되며, 뒤에 온 작은 문서들조차也不例外합니다.
- 두 가지 구조, 서로 반대되는 규칙, 그리고 break 전까지 두 가지 모두를 사용합니다. 어느 하나도 저장 방식을 명시하지 않으며, 각 연산이 무엇을 하는 것만 설명합니다.
- 이것이 추상 데이터형(ADT) 입니다. 이 수업은 교육 과정에서 언급하는 세 가지 ADT, 각 ADT의 연산, 그리고 특정 상황에 대한 justification 방법을 다룹니다.
ADT란 무엇인가
- 추상 데이터형(ADT)은 데이터의 집합과 해당 데이터에 대한 연산의 집합을 말합니다. 이 한 문장이 1점 정의입니다.
- 연산이 무엇을 하는지에 의해 정의되며, 데이터가 어떻게 저장되는지에 따라 결정되지 않습니다. 구현 방식은 숨겨져 있으므로 변경되어도 사용 코드는 영향을 받지 않습니다.
- 스택, 큐, 연결 리스트, 이진 트리, 배열은 모두 ADT입니다.
추상 데이터 타입(ADT)은 다음과 같이 정의됩니다:
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
ADT는 연산(인터페이스)을 지정하며, 구현은 숨겨져 있어 자유롭게 변경할 수 있습니다.
스택
- 스택은 항목이 같은 끝, 즉 최상단(top) 에 추가되고 제거되는 목록입니다. 따라서最後に 추가된 항목이最初に 제거됩니다: LIFO(후입선출).
- 연산: push는 최상단에 추가, pop은 최상단에서 제거, peek는 최상단을 확인하며, 비었는지/차 있는지 테스트합니다.
- 활용: Undo 기록, 뒤로 가기 버튼, 함수 호출의 반환 주소, 괄호 매칭, 백트래킹.

모든 연산은 최상단에서 이루어집니다
스택은 어떤 순서로 작동합니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
스택은 LIFO입니다: 가장 최근에 푸시된 항목이 첫 번째로 팝됩니다.
worked example: 스택 추적
- 스택은 아래에서부터
'P' 'N' 'Z' 'X' 'Y' 'W'를 포함하며, 최상단 포인터는'W'에 위치합니다. 연산POP,POP,PUSH 'A',PUSH 'B',POP을 수행합니다. 스택에 어떤 항목들이 있으며, 포인터는 어디에 있습니까? - 두 개의 팝은 먼저
'W', 다음에'Y'을 제거합니다. 푸시는'A'과'B'을 해당 위치에 넣습니다. 마지막 팝은'B'을 제거합니다. - 스택에는
'P' 'N' 'Z' 'X' 'A'가 있으며, 포인터는'A'에 있습니다. 스택의 가장 긴 항목은 아래쪽인'P'이며, 다섯 번 더 팝이 가능하지만 여섯 번째는 오류입니다. 따라서 팝은 비어 있는지를 먼저 확인합니다.
스택에는 P N Z X Y W가 있으며(상단이 W), POP, POP, PUSH 'A', PUSH 'B', POP를 실행한 후 상단에 있는 항목은 무엇입니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
W와 Y가 팝되고, A가 푸시된 후 B가 푸시되며, B가 팝됩니다. 상단은 A이며, 그 위에 X가 있습니다.
큐
- 큐는 항목이 뒤쪽(rear) 에 추가되고 앞쪽(front) 에서 제거되는 목록입니다. 따라서最初に 추가된 항목이最初に 제거됩니다: FIFO(선입선출).
- 연산: enqueue는 뒤쪽에 추가, dequeue는 앞에서 제거하며, 비었는지/차 있는지 테스트합니다.
- 활용: 인쇄 스풀링, 키보드 버퍼, 스케줄링, 상점의 고객, 너비 우선 탐색(BFS).

뒤에서 연결하고, 앞에서 나갑니다
스택, 큐 & 연결리스트
LIFO vs FIFO
스택은 LIFO(후입선출) 구조이며, 푸시와 팝은 모두 같은 끝(상단)에서 수행됩니다.
큐는 FIFO(선입선출)입니다: 항목들은 ______에서 제거되고 뒤쪽에서 추가됩니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
FIFO: 전면에서 dequeue하고 뒤쪽에서 enqueue합니다 — 사람 줄 서기처럼요.
풀이 예제: 큐에 추가하고 제거하는 방법 설명
- 추가: 큐가 가득 차지 않았는지 확인; rear 포인터가 가리키는 위치에 항목을 저장; rear 포인터를 이동하고(카운트 증가).
- 제거: 큐가 비어 있지 않은지 확인; front 포인터가 가리키는 위치의 항목을 읽음; front 포인터를 이동하고(카운트 감소).
- 사용하는 관례를 명시하십시오: rear 포인터가 다음 빈 공간이라면 먼저 저장하고 이후 이동; rear 포인터가 마지막 항목을 가리킨다면 먼저 이동하고 이후 저장. 일관성이 있으면任何一方 점수 획득 가능.
큐에 항목을 추가하는 단계를 순서대로 나열하십시오 (rear 포인터는 다음 빈 공간으로 표시됨).
난이도 3/5 · 200 코인 + 오늘 첫 완료 시 소액 보너스
이 관례에서는 확인이 먼저 있고, 이후 저장, 이동 순서로 진행됩니다. 사용 중인 관례를 명시하십시오.
연결 리스트
- 연결 리스트는 각 노드(node) 가 데이터 항목과 다음 노드를 가리키는 포인터(pointer) 를 보유하며, 첫 번째 노드를 가리키는 시작 포인터가 있는 목록입니다. 마지막 노드의 포인터는
NULL와 같은 sentinel입니다 - 연산: 삽입, 삭제, 검색 및 트러버서, 헤드에서 시작하여 포인터를 따라 모든 노드를 순서대로 방문합니다.
- 배열에 비해 장점: 삽입이나 삭제가 저렴하며, 포인터만 재연결하면 됩니다. 필요할 때 목록이 확장됩니다. 단점: 무작위 접근이 불가능하며, 열 번째 노드에 도달하려면 아홉 개의 포인터를 따라가야 합니다.

값과 화살표가 반복됨
연결リスト: 포인터로 연결된 노드들
각 노드는 값과 다음 노드를 가리키는 포인터를 저장합니다. 삽입이나 삭제는 단순히 포인터를 재연결할 뿐이며, 배열과는 달리 요소들이 이동하지 않습니다.
연결리스트의 각 노드는以下内容을 포함합니다:
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
노드는 자신의 값과 다음 노드를 가리키는 포인터(참조)를 저장하며, head가 시작을, NULL이 끝을 나타냅니다.
연결리스트는 삽입/삭제가 저렴합니다(포인터만 재연결하면 됨) 하지만 무작위 접근은 느립니다(head에서 포인터를 따라야 하므로).
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
이는 배열과 리스트의 트레이드오프입니다: 배열은 O(1) 인덱스 접근을 제공하지만, 리스트는 저렴한 삽입/삭제를 제공합니다.
worked example: 순서에 맞춰 노드 추가하기
- 오름차순으로 유지되는 linked list에 새로운 값을 삽입하는 방법을 설명하십시오. [4]
- 헤드에서 시작하여 포인터를 따라 트러버싱하며 위치 앞 노드를 찾습니다: 새 값보다 작은 마지막 노드입니다.
- 빈 노드를 가져와 그 안에 새 값을 저장합니다. 새 노드의 포인터를 이전 노드가 현재 가리키는 주소로 설정합니다.
- 그런 다음 이전 노드의 포인터를 새 노드로 설정합니다. 새 값이 맨 앞에 들어갈 경우, 대신 헤드 포인터가 변경됩니다.
정렬된 연결리스트에 값을 삽입하는 단계를 순서대로 나열하십시오.
난이도 3/5 · 200 코인 + 오늘 첫 완료 시 소액 보너스
새 노드를 찾아 채우고, 앞으로 가리키게 한 뒤, 이전 노드를 재연결합니다. 마지막 두 단계를 역순으로 하면 나머지 리스트가 사라집니다.
선택 근거 제시
- 도착한 순서대로 처리해야 하는 항목들(인쇄 작업, 키 입력, 고객 등): queue, 선입선출(LIFO/FIFO) 원칙 때문입니다.
- 가장 최근 항목을 먼저 처리해야 함(undo, 복귀, 중첩 호출 등): stack, 후입선출(LIFO) 원칙 때문입니다.
- 정렬된 집합의 중간에 자주 삽입하거나 삭제되며 크기가 불분명함: linked list, 포인터만 변경되어 이동이 없기 때문입니다.
- 구조물 이름, 규칙 명칭을 제시하고, 해당 규칙을 상황에 연결하십시오.
각 ADT를 규칙과 일반적인 사용 사례에 매칭하십시오.
난이도 2/5 · 140 코인 + 오늘 첫 완료 시 소액 보너스
스택 = LIFO, 큐 = FIFO, 연결리스트는 포인터로 노드를 체인합니다.
인쇄 요청은 발송된 순서대로 인쇄되어야 합니다. 어떤 ADT를 사용해야 하며, 왜입니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
도착 순서는 FIFO 규칙입니다. 스택이라면 최신 작업을 먼저 인쇄할 것입니다.
ADT와 구현의 차이
- ADT는 동적 특성입니다: push와 pop, enqueue와 dequeue, 삽입 및 트러버싱 등.
- 구현은 저장 방식입니다: 이 과정에서는 배열과 몇 개의 포인터 변수를 사용합니다(다음 수업).
- ADT 관련 질문은 연산과 규칙을 묻고, 구현 관련 질문은 배열, 포인터 및 검증 조건을 묻습니다.
놓칠 수 있는 점
- Push와 enqueue는 满了인지 먼저 확인하고, pop과 dequeue는 empty인지 먼저 확인합니다. 검증 코드를 설명에 포함시키십시오.
- linked list에 삽입할 때: 이전 노드의 포인터를 변경하기 전에 새 노드의 포인터를 먼저 설정하지 않으면 나머지 목록이 사라집니다.
- stack은 한쪽 끝에서 변화하고, queue는 양쪽 끝에서 변화합니다. "queue 상단에서 제거"라는 답은 stack에 대한 것입니다.
- 약자를 한 번 풀어서 적으십시오: LIFO(후입선출), FIFO(선입선출).
이해했습니다
- ADT란 데이터 집합과 그에 대한 연산 집합을 뜻하며, 저장 방식이 아닌 동적 특성을 의미합니다.
- stack: 상단에서 추가 및 제거, LIFO, push와 pop · queue: 뒤쪽에서 추가, 앞쪽에서 제거, FIFO, enqueue와 dequeue
- linked list: 값+포인터 노드들이 헤드 포인터에서 시작; 저렴한 삽입/삭제, 느린 무작위 접근; 포인터를 따라 트러버싱
- 규칙에 근거하여 정당화: 도착 순서 → queue; 최신 우선 → stack; 중간频繁的插入 → linked list