๐Ÿ’ซ ETC/Leetcode

Week 1-2. [Stack] 155. Min Stack (Python3)

ming412 2023. 8. 29. 00:35

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •

โœ๏ธ ๋‚˜๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ ์ •๋ฆฌํ•˜๊ธฐ (=์ฒด๊ณ„ํ™”)

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)์— ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ ์‹ ๊ฒฝ์ผ๋‹ค.

 

์ฐธ๊ณ  ์ž๋ฃŒ

LeetCode ํ’€๊ธฐ - 155. Min Stack