Leetcode Java Dinner Plate Stacks
업데이트:
문제
코드
class DinnerPlates {
private List<Stack<Integer>> stacks;
private TreeSet<Integer> treeSet;
private int capacity;
public DinnerPlates(int capacity) {
this.stacks = new ArrayList<>();
this.treeSet = new TreeSet<>();
this.capacity = capacity;
}
public void push(int val) {
if (this.treeSet.isEmpty()) {
this.stacks.add(new Stack<>());
this.treeSet.add(this.stacks.size() - 1);
}
Stack<Integer> stack = this.stacks.get(this.treeSet.first());
stack.push(val);
if (stack.size() == this.capacity) {
this.treeSet.pollFirst();
}
}
public int pop() {
if (this.stacks.isEmpty()) {
return -1;
} else {
int val = this.stacks.getLast().pop();
this.treeSet.add(this.stacks.size() - 1);
while (!this.stacks.isEmpty() && this.stacks.getLast().isEmpty()) {
this.stacks.removeLast();
this.treeSet.pollLast();
}
return val;
}
}
public int popAtStack(int index) {
if (index >= this.stacks.size()) {
return -1;
} else if (index == this.stacks.size() - 1) {
return this.pop();
} else {
this.treeSet.add(index);
Stack<Integer> stack = this.stacks.get(index);
return stack.isEmpty() ? -1 : stack.pop();
}
}
}
/**
* Your DinnerPlates object will be instantiated and called as such:
* DinnerPlates obj = new DinnerPlates(capacity);
* obj.push(val);
* int param_2 = obj.pop();
* int param_3 = obj.popAtStack(index);
*/
결과
설명
- 0부터 좌측에서 우측으로 값을 최대 capacity 만큼 수용 가능한 스택을 무한히 많이 보유한 DinnerPlates 객체를 완성하는 문제이다.
- 생성자인 DinnerPlates(int capacity)는 객체를 초기화 하며 최대 capacity 만큼 수용 가능할 스택을 만들어준다.
- 메서드인 push(int val)는 val 값을 capacity 미만의 값을 보유한 스택에 값을 좌측부터 넣어준다.
- 메서드인 pop()은 가장 처음의 스택에서 오른쪽의 비어있지 않은 값을 꺼내서 반환한다. 단, 값이 존재하지 않으면 -1을 반환한다.
- 메서드인 popAtStack(int index)은 가장 위에 있는 스택에서 index번째 값을 꺼내서 반환한다. 단, 값이 존재하지 않으면 -1을 반환한다.
- 각 연산에 필요한 전역 변수를 정의한다.
- stacks는 각 스택을 저장할 변수이다.
- treeSet은 각 스택의 크기를 저장할 변수이다.
- capacity는 생성자를 통해 주입되는 스택의 최대 크기를 저장할 변수이다.
- 생성자인 DinnerPlates(int capacity)를 완성한다.
- stacks에 ArrayList를, treeSet에 TreeSet을, capacity에 주입된 capacity를 넣어준다.
- 메서드인 push(int val)를 완성한다.
- treeSet이 비어있는 초기 수행인 경우, stacks에 새 Stack을 넣어준 후, treeSet에 현재 스택의 갯수를 저장한다.
- stack에 stacks에서 treeSet의 첫 값에 해당하는 스택을 꺼내 넣어준다.
- stack에 val을 넣어준 후, stack의 크기가 capacity와 동일한 경우, treeSet에 우선 순위가 높은 값을 꺼내 제거한다.
- 메서드인 pop()을 정의한다.
- stacks가 비어있는 경우, 꺼낼 값이 없으므로 -1을 반환한다.
- 위의 경우가 아니라면 아래를 수행한다.
- val에 stacks의 마지막 스택의 우선 순위가 높은 값을 꺼내준다.
- treeSet에 해당 뺀 값을 제외한 현재 스택의 크기를 저장해준다.
- stacks가 비어있지 않거나 stacks의 마지막 스택이 비어있지 않을 때 까지, stacks의 마지막 스택을 삭제하고 treeSet에서 마지막으로 우선 순위가 낮은 값을 값을 제거하여 빈 스택과 저장된 크기 정보를 삭제한다.
- val 값을 반환해준다.
- 메서드인 popAtStack(int index)을 정의한다.
- index가 stacks 크기보다 크거나 같은 경우, 꺼낼 수 없으므로 -1을 반환한다.
- 위의 경우가 아니면서 index가 stacks의 마지막 위치인 경우, 5번의 pop() 메서드를 수행한다.
- 위의 모든 경우가 아니라면 아래를 수행한다.
- treeSet에 index를 추가하여 신규 스택의 위치인 꺼낸 값의 위치를 저장해준다.
- stack에 stacks에서 index번째 스택을 꺼내 넣어준다.
- stack이 버이었으면 -1을, 아니면 마지막 값을 꺼내 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기