[99클럽 코테 스터디 4주차 보너스문제 TIL] 프로그래머스 이중우선순위큐

0
post-thumbnail

99클럽 코테 스터디 4주차 보너스문제 TIL

💙 JAVA 비기너

📌 오늘의 학습 키워드

  • 힙(우선순위 큐)

📌 공부한 내용

📍 오늘의 문제

📍작성 코드

import java.util.Collections;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

class Solution {
    public int[] solution(String[] operations) {
        
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        PriorityQueue<Integer> maxHeap = new PriorityQueue<>(Collections.reverseOrder());
        
        for(String operate : operations) {
            StringTokenizer st = new StringTokenizer(operate);
            String command = st.nextToken();
            int number = Integer.parseInt(st.nextToken());
            
            switch(command) {
                case "D" :
                    if(minHeap.isEmpty() || maxHeap.isEmpty()) break;
                    if(number == 1) {
                        int max = maxHeap.poll();
                        minHeap.remove(max);
                    } else {
                        int min = minHeap.poll();
                        maxHeap.remove(min);
                    }
                    break;
                case "I" :
                    minHeap.add(number);
                    maxHeap.add(number);
                    break;
            }
        }
        
        int maxAnswer = maxHeap.isEmpty() ? 0 : maxHeap.poll();
        int minAnswer = minHeap.isEmpty() ? 0 : minHeap.poll();
        
        int[] answer = {maxAnswer, minAnswer};
        
        return answer;
    }
}

📌 오늘의 회고

이름부터가 이중우선순위큐라서 아 우선순위 큐를 두개 쓰면 되는구나하고 힌트를 얻어갔다.

그래서 우선순위 큐를 오름차순과 내림차순으로 각각 minHeapmaxHeap으로 만들어서 operations에 있는 연산들을 실행시켰다.

foreach문으로 operations을 하나씩 살피면서 "D"로 시작할 경우 minHeapmaxHeap이 비어있는지 확인 후 비어있다면 연산을 패스하고 값이 있다면 "1"인지 "-1"인지에 따라 최대값, 최소값을 삭제해줬다.
"I"로 시작할 경우에는 minHeapmaxHeap에 각각 값을 추가해줬다.

minHeapmaxHeap가 비어있다면 0을 아니라면 각각의 최소값, 최대값을 추출하여 answer배열에 넣어주면서 마무리 했다.

profile
나는 말하는 감자다

0개의 댓글