코딩 테스트/자바

[프로그래머스 / 자바 / Lv.3] 42628 이중우선순위큐

HHRR 2024. 7. 22. 20:43
문제

풀이

 

이중우선순위큐를 구현하는 문제로, 주어진 명령어들을 처리하여 최종적으로 큐의 최댓값과 최솟값을 반환하는 것이다.

1. 두 개의 우선순위 큐 생성 (최소힙, 최대힙)

- 최대힙 정렬은 `Collections.reverseOrder()`로 큐 역순 정렬하여 최대힙을 만든다.

2. 명령어 규칙대로 처리

- I : min, max 두 큐에 모두 add 연산을 수행

- D 1 : 최댓값 삭제

- D -1 : 최솟값 삭제

3. 큐가 비어있으면 [0, 0] 반환하고, 비어있지 않으면 max.peek()으로 최댓값, min.peek()로 최솟값 반환함.

class Solution{
        public int[] solution(String[] operations) {
            PriorityQueue<Integer> min = new PriorityQueue<>();
            PriorityQueue<Integer> max = new PriorityQueue<>(Collections.reverseOrder());
            StringTokenizer st;

            for (int i=0; i<operations.length; i++){
                st = new StringTokenizer(operations[i]);
                char op = st.nextToken().charAt(0);
                int num = Integer.parseInt(st.nextToken());

                switch(op) {
                    case 'I':
                        min.add(num);
                        max.add(num);
                        break;
                    case 'D':
                        if(max.isEmpty()) break;
                        if(num == 1) {
                            int del = max.poll();
                            min.remove(del);
                        }
                        if(num == -1) {
                            int del = min.poll();
                            max.remove(del);
                        }
                }
            }

            if(max.isEmpty()) {
                return new int[] {0, 0};
            }
            return new int[] {max.peek(), min.peek()};
        }
    }