알고리즘/문제풀이

[프로그래머스] 42628 이중우선순위큐 - JAVA

LIRI 2025. 5. 31. 22:41

[프로그래머스] 42628 이중우선순위큐 - JAVA

문제

https://school.programmers.co.kr/learn/courses/30/lessons/42628

문제 분석

조건

명령어 배열에 따라 우선순위 큐에 값을 넣거나 빼는 연산을 하게 된다. 모든 연산이 마쳤을 때 큐에 들어있는 값에서 `[최댓값, 최솟값]`을 출력하는 문제이다. 큐가 비어있다면 `[0, 0]`을 출력한다. 명령어는 아래와 같다.
`I 숫자` ➡️ 숫자를 큐에 삽입
`D 숫자` ➡️ 숫자가 1이면 최댓값, -1이면 최솟값 삭제

풀이방법

자동으로 정렬이 되는 `TreeMap`을 사용하였다. 키값을 기준으로 자동으로 정렬되고 첫 번째 키값이나 마지막 키값을 알 수 있기 때문에 단순 구현으로 문제를 풀 수 있다. 키값을 가져올 때 `TreeMap`이 비어있다면 `NoSuchElementException`이 발생하기 때문에 사이즈를 확인하는 부분만 신경 써주면 된다.

코드

import java.util.*;

class Solution {
    public int[] solution(String[] operations) {
        // 자동으로 정렬이 되는 TreeMap을 사용
        TreeMap<Integer, Integer> treeMap = new TreeMap<>();
        for (String operation : operations) {
            StringTokenizer st = new StringTokenizer(operation);
            String token = st.nextToken();
            int number = Integer.parseInt(st.nextToken());

            if (token.equals("I")) {
                treeMap.put(number, number);
            } else {
                if (treeMap.size() == 0) {  // 트리에 들어있는게 없다면 넘어간다.
                    continue;
                }
                if (number == 1) {
                    treeMap.remove(treeMap.lastKey());
                } else {
                    treeMap.remove(treeMap.firstKey());
                }
            }
        }
        if (treeMap.size() == 0) {
            return new int[]{0, 0};
        }
        return new int[]{treeMap.lastKey(), treeMap.firstKey()};
    }
}

 

TreeMap때문에 날로 먹은 문제 같음.

728x90