
๋ฌธ์ ํด๊ฒฐ ๊ณผ์
โ๏ธ ๋๋ง์ ๋ฐฉ์์ผ๋ก ๋ฌธ์ ์ ๋ฆฌํ๊ธฐ (=์ฒด๊ณํ)
https://leetcode.com/problems/min-stack/?envType=study-plan-v2&envId=top-interview-150
Min Stack - LeetCode
Can you solve this real interview question? Min Stack - Design a stack that supports push, pop, top, and retrieving the minimum element in constant time. Implement the MinStack class: * MinStack() initializes the stack object. * void push(int val) pushes t
leetcode.com
push, pop, top, ์ต์๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์๋ ์คํ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ผ.
- O(1)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ก ๊ตฌํํด์ผ ํ๋ค.
๐ ์ด๋ค ์์ผ๋ก ์ ๊ทผํ๋๊ฐ?
๋ฆฌ์คํธ๋ฅผ ์ด์ฉํ์ฌ ์คํ์ ๋ชจ๋ฐฉํ๋ค.
์คํ์์์ ์ต์๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ ์ํด ๊ฐ์ ์ถ๊ฐํ ๋ "ํ์ฌ ์คํ์์์ ์ต์๊ฐ"๊น์ง ํํ ํํ๋ก ํจ๊ป ์ถ๊ฐํ๋ค.
์คํ์ด LIFO(๊ฐ์ ์คํ ์ค๊ฐ์์ ๊บผ๋ผ ์๋ ์๋ค)์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ด๋ค.

๐ ์์ฌ ์ฝ๋
class MinStack:
def __init__(self):
self.stk = []
def push(self, val: int) -> None:
if self.stk์ ๊ธฐ์กด ์์๊ฐ ์กด์ฌํ๋ฉด:
(val, ์คํ ์ต์๊ฐ) ์ถ๊ฐ
์กด์ฌํ์ง ์์ผ๋ฉด:
(val, val) ์ถ๊ฐ
def pop(self) -> None:
pop()
def top(self) -> int:
์คํ ์๋จ ์์๊ฐ ๊ฐ์ง๊ณ ์๋ ๊ฐ(0) ๋ฆฌํด
def getMin(self) -> int:
์คํ ์๋จ ์์๊ฐ ๊ฐ์ง๊ณ ์๋ ์ต์๊ฐ(1) ๋ฆฌํด
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
๐ฏ ๊ตฌํ ์ฝ๋
class MinStack:
def __init__(self):
self.stk = [] # ๋ฆฌ์คํธ๋ก ์คํ ์๋ฃ๊ตฌ์กฐ ๋ชจ๋ฐฉ
def push(self, val: int) -> None:
if self.stk: # ์คํ์ ์ถ๊ฐ๋๋ ์์๋ ํํ ํํ (val, ํ์ฌ ์คํ์์ ์ต์๊ฐ)
self.stk.append((val, min(val, self.stk[-1][1]))) # ๊ธฐ์กด ์ต์๊ฐ(self.stk[-1][1])๊ณผ val์ ๋น๊ตํด ๋ ์์๊ฒ min_val
else:
self.stk.append((val, val)) # ์คํ์ด ๋น์ด์๋ค๋ฉด ์ต์๊ฐ์ val
def pop(self) -> None:
self.stk.pop()
def top(self) -> int:
return self.stk[-1][0] # top ์์์ ๊ฐ (val)
def getMin(self) -> int:
return self.stk[-1][1] # top ์์์ ์ ์ฅ๋ ์ต์๊ฐ (min_val)
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
๋ด ์ฝ๋๋ฅผ ํ๊ตฌํด๋ณด๊ธฐ
โฑ ์ฑ๋ฅ ์ธก์ (์๊ฐ๋ณต์ก๋/๊ณต๊ฐ๋ณต์ก๋)
์๊ฐ ๋ณต์ก๋๋ O(1)์ด๋ค.
โ๏ธ ์ฑ๋ฅ ํ๊ณ
์คํ์ ๊ฐ ์์๋ฅผ ํํ ํํ๋ก ์ ์ฅํ์ฌ ์์ ์๊ฐ์ ๋ฐํํ ์ ์๋๋ก ํ๋ค.
๋ค๋ฅธ ์ฌ๋์ ์ฝ๋๋ฅผ ํ๊ตฌํด๋ณด๊ธฐ
๐ฏ ๊ตฌํ ์ฝ๋
๋๋ ํ๋์ ์คํ(stk)์ ํ์ฉํ์ง๋ง, getMin() ๋ฉ์๋๋ฅผ ์ํด min_stk์ ํ๋ ๋ ํ์ฉํ ์ ์๋ค.
stk์ ์๋ก์ด ์์๊ฐ ์ถ๊ฐ๋ ๋, min_stk์ ํ์ฌ ์คํ์์ ์ต์๊ฐ์ ์ถ๊ฐํ๋ค. (์ ๊ฑฐ๋ ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ ์คํ ๋ชจ๋์์ ์ ๊ฑฐํ๋ค.)
getMin()์ ํธ์ถํ ๋ min_stk์์ ๊ฐ์ฅ ์๋จ ์์๋ฅผ ๋ฆฌํดํ๋ค.
class MinStack:
def __init__(self):
# ์ผ๋ฐ ์คํ
self.stk = []
# ์ต์๊ฐ ์คํ
self.min_stk = []
def push(self, val: int) -> None:
# ์ผ๋ฐ ์คํ์ ์ถ๊ฐ
self.stk.append(val)
if len(self.min_stk) == 0:
# ์ต์๊ฐ ์คํ์ ๋น์ด ์์ผ๋ฏ๋ก ๊ทธ๋ฅ ์ถ๊ฐ
self.min_stk.append(val)
else:
# ๊ฐ์ฅ ์๋จ์ ๊ฐ๊ณผ ํ์ฌ ์ถ๊ฐ๋๋ ๊ฐ์ ์ต์๊ฐ์ ์ต์๊ฐ ์คํ์ ์ถ๊ฐ
self.min_stk.append(min(val, self.min_stk[-1]))
def pop(self) -> None:
self.min_stk.pop()
return self.stk.pop()
def top(self) -> int:
return self.stk[-1]
def getMin(self) -> int:
# ์ต์๊ฐ ์คํ์ ์๋จ์ ๋ฆฌํด
return self.min_stk[-1]
# Your MinStack object will be instantiated and called as such:
# obj = MinStack()
# obj.push(val)
# obj.pop()
# param_3 = obj.top()
# param_4 = obj.getMin()
โฑ ์ฑ๋ฅ ์ธก์ (์๊ฐ๋ณต์ก๋/๊ณต๊ฐ๋ณต์ก๋)
๋ง์ฐฌ๊ฐ์ง๋ก O(1)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
๋๋ ์
ํ์ด์ฌ์ผ๋ก ํด๋์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด ์กฐ๊ธ ๋ฏ์ค์๋ค.
getMin() ํจ์๋ฅผ ํตํด ์ต์๊ฐ์ O(1)์ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ ์ ๊ฒฝ์ผ๋ค.
์ฐธ๊ณ ์๋ฃ
'๐ซ ETC > Leetcode' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| Week 2-1. [Hash Table] 1. Two Sum (Python3) (0) | 2023.08.30 |
|---|---|
| Week 1-2. [Stack] 150. Evaluate Reverse Polish Notation (Python) (0) | 2023.08.29 |
| Week 1-2. [Linked List] 21. Merge Two Sorted Lists (Python3) (0) | 2023.08.29 |
| Week 1-2. [Linked List] 2. Add Two Numbers (Python3) (0) | 2023.08.29 |
| Week 1-2. [Linked List] 141. Linked List Cycle (Python3) (0) | 2023.08.28 |