October 22, 2020
์ผ๋จ ์ด ๊ธ์ ์ฒ์ ๋ณธ๋ค๋ฉด,
https://dev-seolleung2.netlify.app/development/Stack-Queue/
https://dev-seolleung2.netlify.app/development/Stack-Queue-2/
์ด๋ ๊ฒ ๋๊ฐ๋ฅผ ์ ํ ํ์ต ํด์ค๋ค. ์๋ ๋ง๊ณ ..
queue ํ์ฐ์์์ฐ์ ๋ ๋ฌด์จ ํน์ง์ ๊ฐ์ง๊ณ ์์๋๋ผ?
์! ์ ์ ์ ์ถํ๋ ์ญํ ์ ํ์๊ตฌ๋.
queue
๋ค์๊ณผ ๊ฐ์ method๋ฅผ ๊ตฌํํ์ธ์ :
enqueue(element) - ์์๋ฅผ ํ์ ๋ค์ ์ถ๊ฐํฉ๋๋ค.
dequeue() - ์์๋ฅผ ํ์ ์์์ ์ ๊ฑฐํ๊ณ ๋ฐํํฉ๋๋ค.
size() - ํ์ ํ์ฌ ์์ ๊ฐ์๋ฅผ ๋ฐํํฉ๋๋ค.
Queue ์ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํ ๋ด๋ถ ๋ฉ์๋๋ฅผ ๊ตฌํํ๋ ๊ณผ์ ์ด๋ค.
๊ณ ๊ณ ์ฑ!
part-1/src/queue.js ํ์ผ์ ํ์ธํ๋ฉด ์๋ ์ฝ๋์ ๊ฐ๋ค.
class Queue {
constructor() {
this.storage = {}
this.front = 0
this.rear = 0
}
size() {}
enqueue(element) {}
dequeue() {}
}
module.exports = Queue
stack ์ ์งํํ์ ๋ ์ฒ๋ผ storage ๋ผ๋ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๊ฐ์ฒด๊ฐ ์๋ค. ๊ทธ๋ฐ๋ฐ front, rear?
stack ์ ๋ง๋ค ๋๋ top ์ด๋ผ๋ ๋ณ์ ํ๋๋ฉด ๋์๋๋ฐ, ์ ์ด๋ฒ์ 2๊ฐ์ง?
์ผ๋จ this.front ๋ 0 ์ด๊ณ , ์ด๊ธฐํ ๊ฐ์ด์ ์์ผ๋ก๋ ์๋ฐ๋๋ ๊ณ ์ ๋ ๊ฐ! ์ด๋ผ๋ ๊ฒ์ ์ฃผ๋ชฉํด์ผ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ๋จผ์ ๋ฃ์ ์๋ฃ๊ฐ ๋์ค์ ๋นผ๋ ค๊ณ ํ ๋ ์ ์ผ ๋จผ์ , ๊ทธ๋ฌ๋๊น ๋งจ ์์์ ๋น ์ง๊ฒ ๋ ๊ฑฐ๋ผ๋ ๊ฑฐ๋ค.
์๋ 0์ด๋ค 0.
// ๋งจ ์์ ์์๋ฅผ ์ญ์ ํ ๋ ์ธ ์ธ๋ฑ์ค (์: ๋ฐฐ์ด ๋ฉ์๋ unshift) --> ๊ณ ์ ๋ ๊ฐ
this.front = 0
๊ทธ๋ฆฌ๊ณ this.rear ๋ storage ์ ๋ค์ด๊ฐ ์๋ ์์๋ค์ ๊ฐ์ ์ด๋ฉด์,
๋ค์ด๊ฐ๋ ๊ฐ ๋ฐ์ดํฐ ์์์ key ๊ฐ ๋๋ค.
์๋ฅผ ๋ค์ด storage ์ ๋ฐ์ดํฐ ํ ๊ฐ๊ฐ ์ต์ด ๋ค์ด๊ฐ์ ๋ ๋ค์ด๊ฐ ๊ฐฏ์๋ 1์ด ๋๋ฉด์, ํด๋น ๋ค์ด๊ฐ ๋ฐ์ดํฐ์ key ์ ์ญํ (index ์ฒ๋ผ!) ์ ๊ฒธ์ ํ๋ ์์ด์ธ ๊ฒ์ด๋ค!
์ฆ ๋ฐ์ดํฐ์ ๊ฐฏ์์ key ๋ฅผ ํ์ํ๋ ์ญํ ์ ๋๋ค ์ปจํธ๋กคํ๋ ์ปจํธ๋กค๋ฌ๋ผ ์๊ฐํ๋ฉด ๋๋ค!
(ํฌํ๊ฒธ์ ์ ๋๋ช ์ฌ ์ค์คํ๋โฆโพ๏ธ)
๊ทธ ์ญํ ์ ๋ฐ๋ก this.rear ๊ฐ ํ๋ ๊ฒ์ด๊ณ ์ด๊ธฐ๊ฐ์ 0 ์ผ๋ก ๋์๋ค.
constructor() {
this.storage = {}; // ๊ฒฐ๊ณผ๊ฐ
this.front = 0; // ๋งจ ์์ ์์๋ฅผ ์ญ์ ํ ๋ ์ธ ์ธ๋ฑ์ค (์: ๋ฐฐ์ด ๋ฉ์๋ unshift) --> ๊ณ ์ ๋ ๊ฐ
this.rear = 0; // ๊ฐ์, ์ธ๋ฑ์ค(๊ฐ์-1) --> ์ปจํธ๋กค๋ฌ
}
์ธ์คํด์ค.size()
์์ ์ฝ๋๋ฅผ ํตํด ๋ด๊ฐ storage ์ enqueue ์ด๋ dequeue ์ ํตํด ๋ฃ์ (์๋์ ๋ค๋ฃธ) ์์ฑ๋ค์ ๊ฐฏ์๋ฅผ ๋ฆฌํดํ๋ค.
์? this.rear ๋ ๋ฐ์ดํฐ์ ๊ฐฏ์๋ฅผ ์๋ ค์ฃผ๋ ์ญํ ์ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์์ ์ค๋ช ๐!
return this.rear; ๋ฅผ ํตํด ์ด๋ ํ ์๋ฃ๋ฅผ ๋ฃ๊ณ ๋บ ๋, ๋ณ์ rear ๊ฐ ํ๋ ์ปค์ง๊ฑฐ๋ ์์์ง๋ ๊ฒ์ ์ปจํธ๋กค ํ ์ ์๊ฒ ํ๋ค.
constructor() {
this.storage = {}; // ๊ฒฐ๊ณผ๊ฐ
this.front = 0; // ๋งจ ์์ ์์๋ฅผ ์ญ์ ํ ๋ ์ธ ์ธ๋ฑ์ค (์: ๋ฐฐ์ด ๋ฉ์๋ unshift) --> ๊ณ ์ ๋ ๊ฐ
this.rear = 0; // ๊ฐ์, ์ธ๋ฑ์ค(๊ฐ์-1) --> ์ปจํธ๋กค๋ฌ
}
size() {
return this.rear;
}
stack ์ push ์ฒ๋ผ ๊ฐ์ ๋ฐ์ด ๋ฃ์ด์ฃผ๋ ์ญํ ์ด๋ค. ์๊น stack ์ ๊ฐ์ ๋ฃ๋ ๊ฒ๊ณผ ๋๊ฐ์ ๋ฐฉ์์ด๋ค.
enqueue(element) {
this.storage[this.rear] = element; // this.storage = { 0: element1, 1: element2, 2: element3 }
this.rear++;
return this.storage;
}
์ ์ ์ ์ถ์ด๋ผ๊ณ ์๊ฐํ๋ฏ์ด dequeue() ์ ์ญํ ์ storage ์ ๋งจ ์ ์์๋ฅผ ๋นผ๊ณ ํด๋น ์์๋ฅผ ๋ฆฌํดํ๋ ์ญํ ์ผ ๊ฒ์ด๋ค.
// this.rear ๊ฐ (storage ๋ด ๊ฐฏ์๊ฐ ํ๋๋ ์๋ค๋ฉด)
if (this.rear === 0) {
return this.storage
}
if ๋ก ์์ธ ์ฒ๋ฆฌ๋ฅผ ํด์ค ๋ค ์๋ ์ฝ๋ ๋ถํฐ ์ด์ ์ผ๋ฐ์ ์ธ ์์ ๋นผ๊ธฐ๋ฅผ ์งํํ๋ค.
๋งจ ์์ ๋ฐ์ดํฐ ์์๋ฅผ ๋นผ๋ ค๋ฉด ์ผ๋จ ํด๋น ์์๋ฅผ ์ ํํ ์ค ์์์ผ ํ๋ค.
์ด ๋, ๋ฐ๋ก this.front ๊ฐ ์ฐ์ด๊ฒ ๋๋ค.
this.storage[this.front]
์์ ์ฝ๋๋ ์ฌ์ค์..
this.storage[0]
storage ๊ฐ์ฒด์ 0๋ฒ ๋ฐ์ดํฐ ๋ผ๋ ๋ง๊ณผ ๋์์ด ์ด๋ค.
์ด์ ์ด ๊ฒ์ ๋ณ์์ ๋ฐ๋ก ๋ด๋๋ค.
let omitValue = this.storage[this.front]
delete this.storage[this.front]
์ค ์ง์ ๋ค. ๊ทผ๋ฐ ์ด์ ๋ถํฐ๊ฐ ์ค์ํด ์ง๋ค. ์๋ฅผ ๋ค์ด ๋ณธ๋ค.
์๋์ ๊ฐ์ด ์์๋ฅผ ์ธ์คํด์ค.enqueue() ๋ฅผ ํตํด ๋ฃ์๋ค.
์ด์ ์์ ์์๋ฅผ ์ง์ ๋ฒ๋ฆฌ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
let result = new Queue();
result.enqueue('๐');
{0: "๐"}
result.enqueue('๐');
{0: "๐", 1: "๐"}
result.enqueue('๐');
{0: "๐", 1: "๐", 2: "๐"}
result.enqueue('๐');
{0: "๐", 1: "๐", 2: "๐", 3: "๐"}
result.enqueue('๐ฅ');
{0: "๐", 1: "๐", 2: "๐", 3: "๐", 4: "๐ฅ"}
result.size()
5
result.dequeue();
"๐"
๋ฐ๋๋๋ฅผ ๋ฆฌํดํ๋ฉฐ ํ๋๊ฐ ์์ด์ง๋ ๊ฒ ๊น์ง ์ข์๋๋ฐ ๋ด๊ฐ ์ํ ๋ชจ์ต์ด ์๋๋ค.
result.storage
{1: "๐", 2: "๐", 3: "๐", 4: "๐ฅ"}
result.size();
4
{0: โ๐โ, 1: โ๐โ, 2: โ๐โ, 3: โ๐ฅโ} ์ด ๋๋ ๋ชจ์ต์ ์ํ๋ ๊ฒ์ด๋ค. ์๋ํ๋ฉด ์์ ์ํ์์ ๋ค์ ํ๋ฒ dequeue() ๋ฅผ ํ๋ฉด ์ด์ ๋์ด์ ์คํ๋์ง ์๋๋ค. ์๋๋ฉด delete this.storage[this.front]; ๋ฅผ ํตํด ๊ฐ์ฒด key ๊ฐ 0 ์ธ ๊ฒ์ ์ง์ฐ๋๋ก ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋๋ ๋ค์ dequeue() ๋ฅผ ํ์ ๋, ๋ ์ด์ ์๋๋ ๋ชจ์ต์ด๋ค.
result.dequeue();
undefined // ๋บ ๊ฒ ์์ผ๋ undefined ๋ฅผ ๋ด๋ฑ๋๋ค.
result.storage
{1: "๐", 2: "๐", 3: "๐", 4: "๐ฅ"}
๊ทธ๋๋ก์ด๋ค ใ ใ ์ด๋ป๊ฒ ํ์ง..?
์ด์ dequeue() ๋ฅผ ๋๋ฒ์งธ๋ก ํ์ ๋, 0๋ฒ์งธ์ value๊ฐ์ด undefined ๋ฅผ ๋ฆฌํดํ๋ ์ํฉ์ ๋ํ ์ฝ๋๋ฅผ ์์ฑํ๋ค.
์์ ์ค๋ช ์ฒ๋ผ dequeue() ๋ฅผ ๋๋ฒ์งธ๋ก ํ ์ํฉ์ด ๋์์ ๋๋ฅผ ์ ์ํด ์ฃผ์๋ค.
์ต์ด {0: โ๐โ, 1: โ๐โ, 2: โ๐โ, 3: โ๐โ, 4: โ๐ฅโ} ์์ ๋งจ ์ ๋ฐ๋๋๊ฐ ํ๋ ๋น ์ก์ ๋,
storage ์ ๊ฐฏ์๋ฅผ ๋ปํ๋ this.rear ๋ 4๊ฐ ๋ ๊ฒ์ด๋ค.
if (this.storage[this.front] === undefined) {
//
this.storage[this.front] = this.storage[this.rear - 1]
}
์ค ์ด๋ ๊ฒ ํ๊ณ rear ๋ฅผ ํ๋ ๋บ ๋ค์ ์ ๊ฑฐํ ์์๋ฅผ ๋ฆฌํดํ๊ฒ ํ๊ณ ํ ์คํธ๋ฅผ ๋๋ ค๋ณด๋ฉด, ํต๊ณผ๊ฐ ๋๋ค!
๊ทผ๋ฐ ์ ๋ง ๋์ผ๊น? ์๋๋ค.
๋งจ์์ ์์๋ ๋ฐ๋๋๋ฅผ ์์ด๋ค. ์ค ์ํ๋ ๊ทธ๋ฆผ์ด ๋์๋ค? ํต๊ณผ๋ ๋๊ณ ? ํ๋ ๋บ์ผ๋๊น rear ๋ 4 ๊ณ result.size() ๋ 4์ธ๋ฐ ์๋ ๊ทผ๋ฐ ์ storage ๋งจ ๋์ ํค์๋ ๋ญ๋ฐ..?
์๋ง ์ฌ๊ธฐ์์ ๋ด๊ฐ ํฌํ ๋ฐ์คํฌ์ ์ง๋ฌธ์ ์ฌ๋ ค์ผ ํ ๊ฒ ๊ฐ์๋ฐ,
๋ง์ง๋ง์ผ๋ก ๋ฃ์ ํค์๊ฐ ๋งจ ์์ผ๋ก ์จ๊ฑฐ๋ ๋ ๋ญ๊ณ ๋งจ ๋ง์ง๋ง ์๋ ํค์๊ฐ ๋ค์ด๊ฐ ์๋ค๋๊ฒ ์ด์ํ๋ค.
๋์ฑ ์ฝ๊ธฐ์ ์ธ ์ฌ์ค์ ์ด๊ฒ npm run test ๊ฐ ํต๊ณผ๊ฐ ๋๋ค๋ ์ฌ์ค์ด๋ค.
ํฌํ ๋ฐ์คํฌ ๊ฐ์ด๋ค.
result.storage
{0: "๐ฅ", 1: "๐", 2: "๐", 3: "๐", 4: "๐ฅ"}
result.rear
4
result.size();
4
๊ทธ๋์ ํ์ด๋๊ณผ ๋๋ ์ ๋ง์ง๋ง 4:โ๐ฅโ ๋ฅผ undefined ๋ก ๋ง๋ค ์๊ฐ์ ํ๋ค.
์์ ๋ง๋ if ๋ฌธ ์์ ํ๋๋ฅผ ๋ ์ถ๊ฐํ๋ค.
if (this.storage[this.front] === undefined) {
this.storage[this.front] = this.storage[this.rear - 1] // this.storage = { 0: element2 , ...}
// rear = 1์ธ ์ํ
this.storage[this.rear - 1] = undefined
// { 0: element2, 1: undefined }
}
this.storage[this.rear - 1] = undefined;
์ด ์ฝ๋์ ์๋ฏธ๋,
{0: โ๐โ, 1: โ๐โ, 2: โ๐โ, 3: โ๐โ, 4: โ๐ฅโ} ์ด ์ํ์์..
ํ์ฌ rear ๋ 5์ด๋ค. ๊ทธ๋์ ๋ฐ๋๋๋ฅผ ๋บ๊ณผ ๋์์
this.storage[5 - 1] = undefined;
this.storage[4] = undefined;
์ฆ storage ์ key ๊ฐ 4์ธ ํค์๋ฅผ undefined ๋ก ๋ง๋ ๋ค๋ ์ ์ธ๋ฐ..
dequeue() ์ ํตํด์.. ๋งจ์ ๋ฐ๋๋๊ฐ ์ง์์ง๋ ๊ฒ์ ์ข์๋๋ฐ..
result.storage
{0: "๐ฅ", 1: "๐", 2: "๐", 3: "๐", 4: undefined}
์ ๋์ค์ ๋ฃ์ ํค์๊ฐ ๋งจ์์ ์ค๊ฒ ๋ ๊ฒ์ผ๊นโฆ
์ด๋ฌ๋ฉด ์ ์ ์ ์ถ์ด ์๋์๋โฆ
ํ๋ฒ ๋ dequeue() ๋ฅผ ํ๋..
result.dequeue()
"๐ฅ"
result.storage
{0: "๐", 1: "๐", 2: "๐", 3: undefined, 4: undefined}
์ ๋ญ์ง.. ์ ์ ์ ์ถ์ด ์๋๋ฐ.. ๋ญ์ง ใ ใ
ํต๊ณผ๊ฐ ๋์๋ค๋ ์ ์ด ์์ด๋ฌ๋ ์ด๋ค.. ์ผ๋จ ์ต์ข ์ฝ๋๋ฅผ ๋จ๊ฒจ ๋ณธ๋ค.
class Queue {
constructor() {
this.storage = {} // ๊ฒฐ๊ณผ๊ฐ
this.front = 0 // ๋งจ ์์ ์์๋ฅผ ์ญ์ ํ ๋ ์ธ ์ธ๋ฑ์ค (์: ๋ฐฐ์ด ๋ฉ์๋ unshift) --> ๊ณ ์ ๋ ๊ฐ
this.rear = 0 // ๊ฐ์, ์ธ๋ฑ์ค(๊ฐ์-1) --> ์ปจํธ๋กค๋ฌ
}
size() {
return this.rear
}
enqueue(element) {
this.storage[this.rear] = element // this.storage = { 0: element1, 1: element2, 2: element3... }
this.rear++
return this.storage
}
dequeue() {
if (this.rear === 0) {
return this.storage
}
let minusValue = this.storage[this.front] // element1
delete this.storage[this.front]
// ๊ฒฐ๊ณผ๊ฐ: { 0: undefined, 1: element2, 2: element3 }
// { 0: element2, 1: element2 }
// ๊ธฐ๋ํ ๊ฐ: { 0: element2, 1: element3 }
// 0๋ฒ์งธ์ value๊ฐ์ด undefined๋ผ๋ฉด ์๋์ ์์
์ ํด์ค๋ค.
if (this.storage[this.front] === undefined) {
this.storage[this.front] = this.storage[this.rear - 1] // this.storage = { 0: element2 , ...}
// rear = 1์ธ ์ํ
this.storage[this.rear - 1] = undefined
// { 0: element2, 1: undefined }
}
this.rear--
return minusValue
}
}
module.exports = Queue
์ผ์์์ !!! ใ ใ ใ ใ