์คํ(Stack)๊ณผ ํ(Queue)๋?
์คํ๊ณผ ํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ด๋ฆฌํ๋ ๋ํ์ ์ธ ์๋ฃ๊ตฌ์กฐ์ด๋ค. ์ด๋ค์ push(์ฝ์ ) ๋ฐ pop(์ญ์ ) ์ฐ์ฐ์ ์ ๊ณตํ์ง๋ง, ๋ฐ์ดํฐ์ ์ ์ถ๋ ฅ ๋ฐฉ์์ด ๋ค๋ฅด๋ค.
1. ์คํ(Stack)
์คํ์ LIFO(Last In, First Out) ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ฉฐ, ๊ฐ์ฅ ์ต๊ทผ์ ์ถ๊ฐ๋ ์์๊ฐ ๊ฐ์ฅ ๋จผ์ ์ ๊ฑฐ๋๋ค. ๋ง์น ์ ์๋ฅผ ์์์ฌ๋ฆฌ๊ณ ์์์๋ถํฐ ํ๋์ฉ ์ ๊ฑฐํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํ๋ค.
JavaScript ์ฝ๋:
class Stack {
constructor() {
this.stack = [];
}
push(x) {
this.stack.push(x);
}
pop() {
if (this.isEmpty()) throw new Error("Stack is empty");
return this.stack.pop();
}
isEmpty() {
return this.stack.length === 0;
}
}
์๊ฐ ๋ณต์ก๋: O(1) (push, pop ์ฐ์ฐ ๋ชจ๋ ์์ ์๊ฐ์ ์ํ๋จ)
2. ํ(Queue)
ํ๋ FIFO(First In, First Out) ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ฉฐ, ๋จผ์ ์ถ๊ฐ๋ ์์๊ฐ ๊ฐ์ฅ ๋จผ์ ์ ๊ฑฐ๋๋ค. ์ด๋ ๋ง์น ์ํ ์ฐฝ๊ตฌ์์ ์ค์ ์๋ ๋ฐฉ์๊ณผ ๊ฐ๋ค.
JavaScript ์ฝ๋:
class Queue {
constructor() {
this.queue = [];
}
push(x) {
this.queue.push(x);
}
pop() {
if (this.isEmpty()) throw new Error("Queue is empty");
return this.queue.shift();
}
isEmpty() {
return this.queue.length === 0;
}
size() {
return this.queue.length;
}
}
์๊ฐ ๋ณต์ก๋: O(1) (push ์ฐ์ฐ), O(n) (shift ์ฐ์ฐ → ๊ฐ์ ๊ฐ๋ฅ)
ํจ์จ์ ์ธ ํ ๊ตฌํ์ ์ํด ์ด์ค ์ฐ๊ฒฐ ๋ฆฌ์คํธ ๋๋ ์ํ ๋ฒํผ(Circular Buffer) ๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
3. ์ํผ๋ง์ผ ๋๊ธฐ์ด ๋ฌธ์
์ํผ๋ง์ผ์์ ์ฌ๋๋ค์ด ์ค์ ์๊ณ , ์ผ์ ์๊ฐ์ด ์ง๋๋ฉด ํ ๋ช ์ฉ ๊ณ์ฐ์ ๋ง์น๊ณ ๋๊ฐ๋ ์ํฉ์ ๋ชจ๋ธ๋งํ๋ ๋ฌธ์ ์ด๋ค.
๋ฐฐ์ด A๋ 0๊ณผ 1๋ก ์ด๋ฃจ์ด์ ธ ์์ผ๋ฉฐ:
- 0 → ์๋ก์ด ์ฌ๋์ด ์ค์ ์ฌ (push ์ฐ์ฐ)
- 1 → ์ค ์์ ์ฌ๋์ด ๊ณ์ฐ์ ๋ง์นจ (pop ์ฐ์ฐ)
์ด๋, ์๋ฎฌ๋ ์ด์ ์ด ๊ฐ๋ฅํ๋๋ก ์ต์ ๋ช ๋ช ์ด ์ค์ ์ ์์ด์ผ ํ๋์ง๋ฅผ ๊ตฌํ๋ ๋ฌธ์ ์ด๋ค.
O(n) ํด๊ฒฐ๋ฒ (ํ ํฌ๊ธฐ ์ถ์ )
function groceryStore(A) {
let size = 0;
let result = 0;
for (let i = 0; i < A.length; i++) {
if (A[i] === 0) {
size++;
} else {
size--;
}
result = Math.max(result, -size);
}
return result;
}
์ด ์๊ณ ๋ฆฌ์ฆ์ O(n) ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ฉฐ, ์ต์ํ ํ์ํ ๋๊ธฐ ์ธ์์ ๊ตฌํ ์ ์๋ค.
๋๊ธ