๐ ๋ฌธ์ ์์ฝ
- ์คํ(Stack)๋ง ์ฌ์ฉํด์ ํ(Queue)์ ๋์์ ๊ตฌํํ๋ ๋ฌธ์ .
- FIFO(First-In-First-Out) ๊ตฌ์กฐ์ ํ๋ฅผ ๋ง๋ค์ด์ผ ํ๋ฉฐ, ๋ค์ ๋ฉ์๋๋ฅผ ๊ตฌํํด์ผ ํจ:
push(x): ํ ๋ค์ ์์ x ์ฝ์
pop(): ํ ์์์ ์์ ์ ๊ฑฐ ํ ๋ฐํ
peek(): ํ ์์ ์๋ ์์๋ฅผ ๋ฐํ
empty(): ํ๊ฐ ๋น์ด์๋์ง ์ฌ๋ถ ํ์ธ
โจ ํต์ฌ ์์ด๋์ด
- ๋ ๊ฐ์ ์คํ ์ฌ์ฉ (
inStack, outStack)
inStack: push ์ฐ์ฐ์ฉ (์
๋ ฅ)
outStack: pop / peek ์ฐ์ฐ์ฉ (์ถ๋ ฅ)
pop ๋๋ peek ์ outStack์ด ๋น์ด์์ผ๋ฉด inStack์ ๋ชจ๋ ์์๋ฅผ outStack์ผ๋ก ์ฎ๊ฒจ์ค๋ค.
- ์ด ๊ณผ์ ์์ ์์์ ์์๊ฐ ๋ค์งํ๋ฉฐ, FIFO ๊ตฌํ ๊ฐ๋ฅ
๐ง ๋ฐฐ์ด ์
- ์คํ ๋ ๊ฐ๋ก ํ์ FIFO๋ฅผ ์๋ฎฌ๋ ์ด์
ํ ์ ์๋ค๋ ์ ์ด ํฅ๋ฏธ๋ก์ ๋ค.
shiftStacks() ํจ์๋ก ํ์ํ ๋๋ง ์ฎ๊น์ผ๋ก์จ ์๊ฐ ํจ์จ์ฑ์ ๋์ผ ์ ์๋ค.
- ๊ฐ ์ฐ์ฐ์ด Amortized O(1) ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ก ์ค๊ณ๋์ด ์๋ค.
โฑ๏ธ ์๊ฐ/๊ณต๊ฐ ๋ณต์ก๋
| ์ฐ์ฐ | ์๊ฐ ๋ณต์ก๋ | ์ค๋ช
|
|---|
| push | O(1) | inStack์ push๋ง ํจ |
| pop/peek | ํ๊ท O(1), ์ต์
O(n) | outStack์ด ๋น์ด์์ ๋๋ง ์ด๋ |
| empty | O(1) | ๋ ์คํ์ด ๋ชจ๋ ๋น์๋์ง ํ์ธ |
- ๊ณต๊ฐ ๋ณต์ก๋: O(n) โ ์ต๋ n๊ฐ์ ์์๋ฅผ ์คํ ๋ ๊ฐ์ ์ ์ฅ
๐ป ํต์ฌ ์ฝ๋ ์ ๋ฆฌ (Java)
class MyQueue {
private Stack<Integer> inStack = new Stack<>();
private Stack<Integer> outStack = new Stack<>();
public void push(int x) {
inStack.push(x);
}
public int pop() {
shiftStacks();
return outStack.pop();
}
public int peek() {
shiftStacks();
return outStack.peek();
}
public boolean empty() {
return inStack.isEmpty() && outStack.isEmpty();
}
private void shiftStacks() {
if (outStack.isEmpty()) {
while (!inStack.isEmpty()) {
outStack.push(inStack.pop());
}
}
}
}
๐ฏ ๋๋ ์
- ๋จ์ํ ๋ฌธ์ ์ฒ๋ผ ๋ณด์ฌ๋ ์๋ฃ๊ตฌ์กฐ์ ํน์ฑ์ ๊น์ด ์ดํดํด์ผ ํจ์จ์ ์ผ๋ก ๊ตฌํํ ์ ์๋ค๋ ์ ์ ๋๊ผ๋ค.
- push๋ ๋ฌด์กฐ๊ฑด inStack, pop/peek๋ ํ์ํ ์๊ฐ์๋ง in โ out ์ ์ก ์ ๋ต์ ์ตํ๋ค.
- ํ์ ์คํ์ ์ฐจ์ด์ , ์ ํ ๊ธฐ๋ฒ์ ๋ค์ ๋ณต์ตํ๋ ์ข์ ๋ฌธ์ ์๋ค.