현재 스택에 최솟값을 가지고 있는 스택 자료구조를 구현하는 문제
최솟값의 기준은 현재 스택에 있는 값들을 기준으로 한다.
즉 pop() 을 통해 값이 빠져나갈 때를 생각해야 한다.
push() 를 통해 스택에 값을 저장할 때 마다 조건문으로 최솟값을 확인한다.
이때 최솟값이 갱신되면 현재 최솟값과 이전 최솟값을 스택에 넣는다. (이후 pop() 로직에서 갱신을 위한 로직)
pop() 을 통해 스택에 값을 뺄 때 마다 조건문으로 최솟값과 비교를 한다.
만약 현재 pop() 한 값이 최솟값과 같다면, 최솟값을 pop() 한 값으로 갱신해준다.
이렇게 pop() 을 2번 하는 로직을 통해 계속 최솟값을 유지할 수 있다.
스택에 이미 구현되어 있는 메서드들과 크게 다른 메서드가 없어서 최솟값을 어떻게 기록하는 지 고민을 했었다.
이 문제도 결국 스택이 가지고 있는 특성을 이용하면 될 것 같았고 후입선출에 대한 개념을 이용하여 풀 수 있었다.
class MinStack {
Stack<Integer> stack = new Stack<>();
int min = Integer.MAX_VALUE;
public MinStack() {
this.stack = new Stack<Integer>();
}
public void push(int val) {
if (val <= min) {
stack.push(min);
min = val;
}
stack.push(val);
}
public void pop() {
if (stack.pop() == min) min = stack.pop();
}
public int top() {
return stack.peek();
}
public int getMin() {
return min;
}
}
