Leetcode Java Maximum Frequency Stack
업데이트:
문제
코드
class FreqStack {
private int max;
private Map<Integer, Integer> frequencyMap;
private List<Deque<Integer>> valList;
public FreqStack() {
this.max = 0;
this.frequencyMap = new HashMap<>();
this.valList = new ArrayList<>();
}
public void push(int val) {
int frequency = this.frequencyMap.getOrDefault(val, 0) + 1;
this.frequencyMap.put(val, frequency);
this.max = Math.max(this.max, frequency);
if (frequency > this.valList.size()) {
this.valList.add(new ArrayDeque<>());
}
this.valList.get(frequency - 1).push(val);
}
public int pop() {
int val = this.valList.get(this.valList.size() - 1).pop();
if (this.max == 1) {
this.frequencyMap.remove(val);
} else {
this.frequencyMap.replace(val, this.max - 1);
}
if (this.valList.get(this.valList.size() - 1).isEmpty()) {
this.valList.remove(this.valList.size() - 1);
this.max--;
}
return val;
}
}
/**
* Your FreqStack object will be instantiated and called as such:
* FreqStack obj = new FreqStack();
* obj.push(val);
* int param_2 = obj.pop();
*/
결과
설명
- 주어진 값을 스택에 넣고, 스택에서 가장 많이 발생한 값을 반환하는 FreqStack 클래스를 완성하는 문제이다.
- 생성자인 FreqStack()는 주어진 데이터 구조를 초기화하는 역할을 수행한다.
- 메서드인 push(int val)는 주어진 값을 스택에 값을 넣는 역할을 수행한다.
- 메서드인 pop()은 스택에서 가장 많이 발생한 값을 스택에서 제거하고 반환하고, 동일하게 발생한 값이 여럿일 경우 먼저 들어온 스택의 top에 가까운 값을 제거하면서 반환한다.
- 문제 풀이에 필요한 전역 변수를 정의한다.
- max은 최대 발생 횟수를 저장할 변수이다.
- frequencyMap은 숫자 별 발생 횟수를 키와 값으로 저장할 변수이다.
- valList는 발생 횟수에 해당하는 값을 저장할 변수이다.
- 생성자인 FreqStack()을 정의한다.
- max에 초기 횟수인 0을 넣어 초기화한다.
- frequencyMap은 키와 값으로 저장하기 위해 HashMap으로 초기화한다.
- valList는 발생 횟수 별 값을 저장하기 위해 ArrayList로 초기화한다.
- 메서드인 push(int val)를 정의한다.
- frequency에 frequencyMap에서 val에 해당하는 발생 횟수를, 없으면 0을 가져와 1을 더해서 넣어준다.
- frequencyMap에 val에 해당하는 발생 횟수인 frequency로 바꿔준다.
- max에 max와 frequency 중 큰 값을 넣어 많이 발생한 횟수를 갱신한다.
- frequency가 valList의 크기보다 큰 경우, valList에 ArrayDeque를 새로 생성하여 넣어준다.
- valList의 $frequency - 1$번째의 ArrayDeque에 val을 넣어준다.
- 메서드인 메서드인 pop()을 정의한다.
- val에 valList에서 가장 많이 발생한 위치의 값 중 top에 가까운 값을 꺼내준다.
- max가 1인 한 번만 발생한 값인 경우, frequencyMap에서 해당 값의 발생 횟수를 제거한다.
- max가 1이 아니면 frequencyMap에서 해당 값의 발생 횟수를 차감한다.
- valList의 가장 많이 발생한 위치의 ArrayDeque가 비어있는 경우, 해당 ArrayDeque를 제거하고 max를 차감한다.
- 마지막으로 임시 저장한 val을 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기