오늘은 Min Stack을 구현하는 문제를 풀어보자.
문제는 아래 leetcode에서 확인할 수 있다.
https://leetcode.com/problems/min-stack/
Min Stack이란 push, pop, top, getMin function을 가지는 스택이다.
여기서 전제 조건은 모든 function은 시간 복잡도가 O(1)이어야 한다.
pop과 top은 기존 스택처럼 구현하면 된다.
push를 할 때도 MinStack이 최소값(minVal이라 하겠다)을 알고 있다면 새로운 값과 비교해서 더 작은 값을 minVal로 바꿔주면 된다.
그러나 문제는 pop()을 했을 때 남은 스택에서 최소값이 무엇인지를 구하는 방법이다.
기존에 최소값을 구하는 여러가지 방법을 생각해봤지만 아무리 생각해도 O(1)로 구현할 수 있는 방법은 없었다.
그래서 결국 힌트를 참고했다. (책 Cracking the Coding Interview 6th Edition Q3.2)
세번째 힌트에서는 '각 노드가 substack의 최소값을 알 수 있다면' 라고 적혀 있었다. 여기서 substack이란 노드의 아래에 있는 스택을 의미한다.
서브스택을 대략 그림으로 나타내면 위와 같다.
이런 방법으로 구현한 코드는 아래와 같다.
class Node:
def __init__(self, val, minVal):
self.val = val
self.minVal = minVal
class MinStack:
def __init__(self):
self.stack = []
def push(self, val: int) -> None:
minVal = self.getMin()
if val < minVal:
self.stack.append(Node(val, val))
else:
self.stack.append(Node(val, minVal))
def pop(self) -> None:
self.stack.pop()
def top(self) -> int:
return self.stack[-1].val
def getMin(self) -> int:
if len(self.stack) == 0:
return float("inf")
return self.stack[-1].minVal
물론 Node 클래스 사용하지 않고 [val, minVal] 이런식으로 구현해도된다.
출처
본문에 포함
'개발 > 알고리즘 | 자료구조' 카테고리의 다른 글
[자료구조] 그래프 (Graph) (0) | 2022.09.22 |
---|---|
[자료구조] 트리 (Tree) - 이진 트리 순회 (Binary Tree Traversal) | 트라이 (Trie, Prefix Trees) (0) | 2022.09.17 |
[알고리즘, Python] 연결 리스트에서 중간 노드 삭제하기 (0) | 2022.09.15 |
[알고리즘, Python] 두 문자열이 아나그램 (Anagram)인지 확인하기 (0) | 2022.09.14 |
[알고리즘, Python] 회전 정렬 배열 탐색 (Search in Rotated Sorted Array) (0) | 2022.09.13 |