-
Notifications
You must be signed in to change notification settings - Fork 6
3주차
코딩 테스트에서 매우 자주 등장하는 선형 자료구조
- 데이터를 어떤 순서로 넣고 꺼내느냐에 따라 동작 방식이 달라진다.
- 특히 두 자료구조는
순서 처리,대기열 관리,괄호 검사,탐색(BFS/DFS)등과 깊게 연결되어 있다. - 삽입과 삭제가 어느쪽에서 일어나는지,
그리고 어떤 상황에서
Stack을 쓰고Queue를 써야 하는지를 정확하게 이해하는 것이 중요하다. ㅤ
나중에 들어온 데이터가 먼저 나가는 후입선출 구조로, LIFO(Last In, First Out) 구조라고도 부른다.
- 한쪽 끝에서만 삽입과 삭제가 일어난다.
- 가장 마지막에 들어온 데이터가 가장 먼저 나온다.
- 재귀, 되돌리기(Undo), 괄호 검사 문제에 자주 사용된다.
- DFS와도 자주 연결되는 개념이다.
-
push(e): 새로운 요소 e를 스택의 최상단에 추가 -
pop(): 스택의 맨 위에 있는 요소를 꺼내서 변환 -
peek(): 스택의 최상단 요소를 삭제하지 않고 반환 -
isEmpty: 스택이 비어있으면True반환 / 아니면False반환 -
isFull: 스택이 가득 차 있으면True반환 / 아니면False반환
참고
-
push의 경우 상단에 어떤 요소를 쌓을 지 그 정보를 입력해 주어야 한다. -
pop의 경우는 무조건 가장 상단의 요소를 삭제하는 것이므로 별도의 입력이 필요없다.
const stackList = [];
function push(data) {
stackList.push(data);
}
function pop() {
// 가장 마지막 요소 삭제 및 반환
const data = stackList[stackList.length - 1];
stackList.pop();
return data;
}
for (let index = 0; index < 10; index++) {
push(index); // 0번부터 9번까지 데이터가 들어간다.
}
console.log(pop()); // 9가 출력된다.ㅤ
먼저 들어온 데이터가 먼저 나가는 선입선출 구조로, FIFO(First In, First Out) 구조라고도 부른다.
- 뒤에서 삽입하고, 앞에서 삭제한다.
- 가장 먼저 들어온 데이터가 가장 먼저 나온다.
- 대기열, 작업 순서 처리, BFS 문제에 자주 사용된다.
- 입력 순서를 유지해야 하는 상황에서 유용하다.
-
enqueue(): 큐에 끝(rear)에 항목을 추가 -
dequeue(): 큐에 맨 앞(front)에 항목을 제거 -
peek(): 큐에 맨 앞(front)에 있는 항목을 반환 -
isfull(): 큐가 가득 찼는지 확인 -
isEmpty(): 비어 있는지 확인
참고
- Queue의
Rear(끝)에서 요소를 추가하는 작업을enqueue라고 하며,Front(맨 앞)에서 요소를 제거하는 작업을dequeue라고 한다.
const queueList = [];
function enqueue(data) {
queueList.push(data); // 뒤에 넣기
}
function dequeue() {
return queueList.shift(); // 앞에서 꺼내기
}
for (let index = 0; index < 10; index++) {
enqueue(index); // 0부터 9까지 들어감
}
console.log(dequeue()); // 0
console.log(dequeue()); // 1데이터를 FIFO 순서로 처리하는 가장 기본적인 큐의 형태이다.
큐의 마지막 요소가 첫 요소와 연결된 큐로, 원형으로 순환하는 특징을 가진다.
각 데이터 요소에 우선순위를 할당하고 해당 우선순위에 따라 데이터를 처리하는 큐
양쪽에서 삽입, 삭제가 가능한 구조
| 구분 | Stack | Queue |
|---|---|---|
| 동작 방식 | LIFO | FIFO |
| 삽입 위치 | 한쪽 끝 | 뒤 |
| 삭제 위치 | 같은 쪽 끝 | 앞 |
| 대표 활용 | 괄호 검사, DFS, Undo | BFS, 대기열, 작업 처리 |
✨Tip
자료를 어떤 순서로 처리해야 하는가?
- 가장 최근 값부터 처리해야 한다면? ➡
Stack - 들어온 순서대로 처리해야 한다면? ➡
Queue
참고
- 가득 찬
Stack혹은Queue에 요소를 추가하려고 할 때Overflow가 발생하며, 빈 큐에서 요소를 제거하려고 할 때Underflow가 발생한다.
Stack / Queue 문제는 대부분 순서 처리 방식을 묻는 경우가 많으며,
다음과 같은 패턴이 등장하면 Stack 또는 Queue 문제일 가능성이 높다.
가장 마지막에 넣은 값을 먼저 꺼내야 하는 경우,
Stack을 주로 사용하자!
문제에서 자주 나오는 형태
- 괄호 짝 맞추기
- 문자열에서 특정 문자 제거
- 되돌리기 기능
- 이전 상태 추적
접근 방법
- 조건에 따라
push - 필요할 때
pop - 가장 위에 있는 값과 현재 값을 비교하며 처리
가장 먼저 들어온 값을 먼저 처리해야 하는 경우,
Queue를 주로 사용하자!
문제에서 자주 나오는 형태
- 프린터 대기열
- 카드 뽑기
- BFS
- 시간 순서 시뮬레이션
접근 방법
- 뒤(
Rear)에 데이터를 추가 - 앞(
Front)에서 데이터를 꺼내며 처리 - 처리 순서를 유지하면서 반복
문자열
s가 주어졌을 때, 괄호가 올바르게 짝지어졌는데 판단하라!
ㅤ
🐧이해가 제대로 되지 않으셨다고요? 예시를 들어 보겠습니다.
-
()()→ 올바름 -
(())()→ 올바름 -
)()(→ 올바르지 않음
Input Size & Algorithm Complexity
5주차 - Two Pointers / Sliding Window
13주차 - Simulation / Implementation
백현빈 → 강민주 → 조수빈 → 임현빈 → 전병훈 → 이건희
(이후 동일한 순서로 반복)