본문 바로가기
문제풀이/Programmers 문제풀이

[ 알고리즘 ] 코딩 - Programmers - 이중우선순위큐.java

by 마늘아빠 2021. 1. 20.
728x90
반응형

문제 링크

programmers.co.kr/learn/courses/30/lessons/42628

 

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

 

programmers.co.kr


* 프로그래머스 - Level3..? - 우선순위큐 2개 이용

명령 예시
입출력 예시


< 로직 >

* 우선순위 큐를 2개 만든다

* 하나는 최소값 관리 하나는 최대값 관리를 한다

* 삭제 명령이 들어오면 최소 최대 두개의 큐에서 모두 지워준다.

* 내가 이상하게 푼건가.. 조금 빈약해 보인다


import java.util.PriorityQueue;
import java.util.StringTokenizer;
class Solution {
    public int[] solution(String[] operations) {
      		PriorityQueue<Integer> minPqueue = new PriorityQueue<Integer>();
	    	PriorityQueue<Integer> maxPqueue = new PriorityQueue<Integer>(((o1,o2) -> Integer.compare(o2, o1)));
	    	
	    	
	    	for(int i = 0; i < operations.length; i++) {
	    		StringTokenizer stt = new StringTokenizer(operations[i]);
	    		String command = stt.nextToken();
	    		int num = Integer.parseInt(stt.nextToken());
	    		
	    		switch(command) {
	    		case "I": // 삽입
	    			input(minPqueue, maxPqueue, num);
	    			break;
	    		case "D": // 삭제
	    			delete(minPqueue, maxPqueue, num);
	    			break;
	    		}
	    	}
	    	
	        int[] answer = new int[2];
	        
            // 출력
	        if(minPqueue.isEmpty()) answer[1] = 0;
	        else answer[1] = minPqueue.poll();
	        if(maxPqueue.isEmpty()) answer[0] = 0;
	        else answer[0] = maxPqueue.poll();
	        
	        return answer;
    }
    private void delete(PriorityQueue<Integer> minPqueue, PriorityQueue<Integer> maxPqueue, int num) {
          // 이거를 굳이 나눌 필요가 있었을까?? 
            if(num == -1) { // 최소 삭제
                if(!minPqueue.isEmpty()) {
			        int min = minPqueue.poll();
			        maxPqueue.remove(min);
				}
			} else { // 최대 삭제
				if(!maxPqueue.isEmpty()) {
					int max = maxPqueue.poll();
					minPqueue.remove(max);
				}
			}
		}

		private void input(PriorityQueue<Integer> minPqueue, PriorityQueue<Integer> maxPqueue, int num) {
			maxPqueue.offer(num);
			minPqueue.offer(num);
			
		}
}
반응형