일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- 스택
- 해시테이블
- REST_API
- 회고
- CSS
- 자료구조
- 카카오
- 30daysdowoonchallenge
- Til
- vercel
- superstarjypnation
- UI
- web
- 백준
- 생활코딩
- 프로그래머스
- html
- React
- javascript
- Next.js
- 자바스크립트
- redux
- useState
- level1
- 코드스테이츠
- mysemester
- UX
- 큐
- 프로토타입
- 운영체제
- Today
- Total
데굴데굴
TIL: 2022-11-17 본문
⚙️ 오늘 배운 주제
자료구조 - 스택, 큐
🐹 오늘의 기분
섹션 4에 들어왔다. 이번 유닛에서는 자료구조를 배우는데 그 첫 타자는 스택과 큐였다. 독학할 때 파이썬으로 공부해본 적이 있어서 개념 자체는 크게 어렵게 느껴지지 않았다. 자바스크립트 class
로 구현해보고 두 자료구조를 응용한 여러 문제를 푸는 것이 어려웠다. 브라우저 스택이랑 박스 포장까지는 페어분과 고민하면서 나름 빠르게 풀었는데 프린터 큐에서 완전 막혀버렸다. 한 시간 정도 고민하다가 결국 레퍼런스를 봤는데 더 이해가 안 됐다 (?) 라이브세션에서 알려주신 코드가 더 이해가 잘 됐다. 올려주신 레퍼런스 보면서 풀이 뜯어보고 혼자 다시 풀어보려고 한다.
🗝 키워드
스택, 큐, 후입선출, 선입선출, push, pop, enqueue, dequeue
🗣 스스로에게 설명
스택의 구조와 특징
후입선출 LIFO
가장 나중에 들어온 요소가 가장 먼저 빠져나간다.
데이터는 하나씩만 들어가고 나올 수 있으며 데이터의 입구와 출구가 같다. (입출력 방향이 같다)
스택은 크기가 제한되어 있어 이를 초과하면 스택오버플로우가 발생할 수 있다.
스택에 삽입하는 연산을 push
, 마지막 요소를 빼는 연산을 pop
이라고 한다.
자바스크립트 class
로 스택을 구현한다면 아래와 같이 쓸 수 있다.
class Stack {
constructor() {
this.storage = {};
this.top = 0;
}
size() {
return Object.keys(this.storage).length;
}
push(element) {
this.storage[this.top] = element;
this.top += 1;
}
pop() {
if (this.size() === 0) {
return;
}
const result = this.storage[this.top - 1];
delete this.storage[this.top - 1];
this.top -= 1;
return result;
}
}
자바스크립트 배열을 스택처럼 쓴다면 배열의 push
와 pop
메소드를 이용할 수 있다.
큐의 구조와 특징
선입선출 FIFO
가장 먼저 들어온 요소가 가장 먼저 빠져나간다.
스택과 마찬가지로 데이터는 하나씩만 들어가고 나올 수 있다.
큐는 입구와 출구가 따로 마련되어 있다. (입출력 방향이 다르다)
큐에 데이터를 삽입하는 연산을 enqueue
, 데이터를 빼는 연산을 dequeue
라고 한다.
큐는 데이터가 입력된 순서대로 처리할 때 주로 사용한다.
대표적인 예로 프린터 큐가 있다.
자바스크립트 class
로 큐를 구현한다면 아래와 같이 쓸 수 있다.
class Queue {
constructor() {
this.storage = {};
this.front = 0;
this.rear = 0;
}
size() {
return Object.keys(this.storage).length;
}
enqueue(element) {
this.storage[this.rear] = element;
this.rear += 1;
}
dequeue() {
if (this.size() === 0) {
return;
}
const result = this.storage[this.front];
delete this.storage[this.front];
this.front += 1;
return result;
}
}
자바스크립트 배열을 큐처럼 쓴다면 배열의 shift
와 push
메소드를 이용할 수 있다.
하지만 배열을 이용하면 shift
연산 수행 시 빈 자리를 메꾸기 위해 나머지 요소들이 한 칸씩 앞으로 이동해야 하므로 O(n)의 시간이 걸린다는 것에 유의해야 한다.
❓ 막혔던 부분
코드를 치는 것보다 문제에서 요구하는 바를 이해하고 로직을 생각해내는 것이 더 중요함을 새삼 깨달았다.
문제를 풀다 막힐 때에는 아무리 생각해도 한 가지 방법으로만 생각이 흘러가서 그게 고민이다 ㅠㅠ
🔎 공부가 더 필요한 부분
원형 큐 (CIrcular Queue) - 선형 큐의 단점을 보완한 자료구조, 맨 앞과 뒤의 인덱스를 기억하여 선형 배열을 원형인 것처럼 사용하는 자료구조이다. (참고: https://velog.io/@mcc919/Data-Structure-%EC%9B%90%ED%98%95-%ED%81%90Circular-Queue-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0)
'Lesson > TIL' 카테고리의 다른 글
TIL: 2022-11-21 (0) | 2022.11.21 |
---|---|
TIL: 2022-11-18 (0) | 2022.11.18 |
TIL: 2022-11-14 (0) | 2022.11.14 |
TIL: 2022-11-11 (0) | 2022.11.12 |
TIL: 2022-11-10 (0) | 2022.11.10 |