문제링크 - https://leetcode.com/problems/min-stack/?envType=study-plan-v2&envId=top-interview-150
해당 문제는 기본적인 stack을 구현하되 현재 stack의 최솟값을 반환해야한다는 제약 조건이 있다.
기본적으로 배웠던 stack을 구현하기 위해 int 배열로 minStack을 구현하고 int lowestValue를 선언하여 최솟값을 관리하여 했으나 구현하면서 다음과 같은 문제점을 겪었고 해결 방법을 생각했다.
minStack을 구현하기 위해 기본 데이터를 저장할 리스트와 해당 위치까지의 최소값을 저장한 리스트가 필요하다. 해당 데이터는 생성되면 할당하도록 한다.
stack
minValues
public MinStack() {
stack = new ArrayList<>();
minValues = new ArrayList<>();
}
데이터를 입력했을 때 다음과 같은 과정으로 진행한다.
1. 실제 값들을 저장하는 stack에 값 추가하기
2. 앞까지 저장되어있던 최솟값과 비교하여 더 작은 값을 현재 위치 최솟값으로 저장하기
public void push(int val) {
stack.add(val);
if (minValues.isEmpty() || val <= minValues.get(minValues.size() - 1)) {
minValues.add(val);
} else {
minValues.add(minValues.get(minValues.size() - 1));
}
}
데이터를 pop했을 때 다음과 같은 과정으로 진행한다.
1. 실제 값들을 저장하는 stack에 맨 뒤의 값 삭제하기
2. 최소 값들을 저장하는 minValues에 맨 뒤의 값 삭제하기
public void pop() {
stack.remove(stack.size() - 1);
minValues.remove(minValues.size() - 1);
}
최근의 저장된 값과 최솟값은 각 리스트 맨 위의 값을 반환하면 된다.
public int top() {
return stack.get(stack.size() - 1);
}
public int getMin() {
return minValues.get(minValues.size() - 1);
}
class MinStack {
private List<Integer> stack;
private List<Integer> minValues;
public MinStack() {
stack = new ArrayList<>();
minValues = new ArrayList<>();
}
public void push(int val) {
stack.add(val);
if (minValues.isEmpty() || val <= minValues.get(minValues.size() - 1)) {
minValues.add(val);
} else {
minValues.add(minValues.get(minValues.size() - 1));
}
}
public void pop() {
stack.remove(stack.size() - 1);
minValues.remove(minValues.size() - 1);
}
public int top() {
return stack.get(stack.size() - 1);
}
public int getMin() {
return minValues.get(minValues.size() - 1);
}
}
시간 복잡도
공간 복잡도
stack
와 minValues
에 저장된 요소의 개수와 공간 복잡도는 같아진다.다음과 같은 점수를 기록했다.
ArrayList를 사용함으로 여러 장점을 얻을 수 있었다.
하지만 더 고려해야할 것도 있었다.