
스택을 디자인하되, push, pop, top 및 최소 요소를 상수 시간에 검색할 수 있는 스택을 구현하십시오.
MinStack 클래스를 구현하십시오:
MinStack()은 스택 객체를 초기화합니다. void push(int val)는 요소 val을 스택에 추가합니다. void pop()은 스택의 맨 위 요소를 제거합니다. int top()은 스택의 맨 위 요소를 가져옵니다. int getMin()은 스택에서 최소 요소를 검색합니다. 각 함수에 대해 O(1) 시간 복잡도를 가진 솔루션을 구현해야 합니다.

Stack 문제라 stack을 사용하지 않고 문제를 해결하려고 List를 활용하여 문제를 풀었습니다.
MinStack() 생성자를 List로 만듭니다.void push(int val) : .add(val)를 하여 변수를 순차적으로 저장합니다.void pop() : .remove(stack.size - 1)을 하여 마지막 데이터를 제거합니다. int top() : stack.get(stack.size() - 1)으로 마지막 데이터를 조회여 반환합니다. int getMin()은 스택에서 최소의 값을 반환해야 합니다.stack을 복사합니다.minStack을 오름차순 정렬을 합니다.class MinStack {
List<Integer> stack;
public MinStack() {
stack = new ArrayList<>();
}
public void push(int val) {
stack.add(val);
}
public void pop() {
stack.remove(stack.size() - 1);
}
public int top() {
return stack.get(stack.size() - 1);
}
public int getMin() {
List<Integer> minStack = new ArrayList<>(stack);
Collections.sort(minStack);
return minStack.get(0);
}
}
- 메소드
push(),pop(),top()에서 시간 & 공간복잡도가 O(1)인데getMin()에서 시간 & 공간복잡도가 O(n)으로 측정됩니다.
해당 문제를 해결하결하고 통과를 했지만
각 함수에 대해 O(1) 시간 복잡도를 가진 솔루션을 구현해야 합니다.라는 문제 내용을 충족시키 못했습니다.
그래서getMin()을 O(1)의 시간 복잡도로 구현하기 위해 최소값을 저장하는 ListminStack을 하나 더 추가하였습니다.
minStack이 비어있으면 추가를하여 최소값을 저장합니다.minStack에 최소값 데이터가 있으므로 새로운 값과 현재 최소값과 비교하여 더 작거나 같으면 minStack에 추가합니다.minStack에서 최소값을 비교합니다. 최소값이 같으면 minStack에서도 제거합니다.class MinStack {
List<Integer> stack;
List<Integer> minStack;
public MinStack() {
stack = new ArrayList<>();
minStack = new ArrayList<>();
}
public void push(int val) {
stack.add(val);
if (minStack.isEmpty() || val <= minStack.get(minStack.size() - 1))
minStack.add(val);
}
public void pop() {
if (stack.get(stack.size() - 1).equals(minStack.get(minStack.size() - 1)))
minStack.remove(minStack.size() - 1);
stack.remove(stack.size() - 1);
}
public int top() {
return stack.get(stack.size() - 1);
}
public int getMin() {
return minStack.get(minStack.size() - 1);
}
}