본문 바로가기

Archived(CSE Programming)/알고리즘(Java)

프로그래머스 - 이중우선순위 큐(Java, LV3)

https://programmers.co.kr/learn/courses/30/lessons/42628?language=java

 

코딩테스트 연습 - 이중우선순위큐

 

programmers.co.kr

풀이
  • 우선순위큐(heap)을 오름차순, 내림차순(Collections.reverseOrder()) 기준으로 하나씩 만든다
  • 삽입의 경우 두 heap에 각각 넣어준다
  • 최대값 삭제의 경우 내림차순 우선순위큐에서 최대값을 찾아서 두 heap에 remove 한다
  • 최소값 삭제의 경우 오름차순 우선순위큐에서 최솟값을 찾아서 두 heap에 remove 한다 
  • 결과값을 출력하는데 heap이 empty가 아닐 경우에만 값을 넣어 출력한다
import java.util.*;

class Solution {
    public int[] solution(String[] operations) {
        int[] answer = new int[2];
        PriorityQueue<Integer> q1 = new PriorityQueue<>(); // 오름
        PriorityQueue<Integer> q2 = new PriorityQueue<>(Collections.reverseOrder()); // 내림
        
        // 문자열 처리
        for(String operation : operations){
            // 삽입
            if(operation.substring(0,1).equals("I")){
                int temp = Integer.valueOf(operation.substring(2));
                q1.add(temp);
                q2.add(temp);
            }
            // 최대값 삭제
            else if(operation.equals("D 1")){
                // 진행 불가 시
                if(q2.isEmpty()){
                    continue;
                }
                // 삭제
                int max = q2.peek();
                q1.remove(max);
                q2.remove(max);
            }
            
            // 최소값 삭제
            else if(operation.equals("D -1") ){
                // 진행 불가 시
                if(q1.isEmpty()){
                    continue;
                }
                // 삭제
                int min = q1.peek();
                q1.remove(min);
                q2.remove(min);
            }
        }
        
        // 값이 있을 경우
        if(!q1.isEmpty()){
            answer[0] = q2.peek(); // 최대
            answer[1] = q1.peek(); // 최소
        }
        
        return answer;
    }
}