코딩 테스트/프로그래머스
[프로그래머스][Level3][JAVA] 이중우선순위큐
갓생사는 김초원의 개발 블로그
2021. 2. 7. 14:59
[문제 설명]
programmers.co.kr/learn/courses/30/lessons/42628
코딩테스트 연습 - 이중우선순위큐
programmers.co.kr
[풀이 내용]
JAVA의 PriorityQueue 자료구조를 이용하여 해결하는 문제다.
이 때 기억해야할 점은 다음 두가지이다.
1. JAVA의 PriorityQueue는 min heap이 default이다.
2. max heap을 구현하고 싶다면 Collections.reverseOrder() 옵션을 사용한다.
문제에서 최댓값을 삭제하는 경우와 최솟값을 삭제하는 경우가 둘 다 존재한다.
min heap과 max heap이 둘 다 존재해야하므로 PriorityQueue 를 2개 생성하였다.
느낀점:
Level3라고 하기엔 너무 쉬운문제다. 그래도 PriorityQueue에 대한 기본 특징을 다시 되짚고 넘어갈 수 있는 문제다.
[JAVA code]
package com.algorithm.programmers.level3;
import java.util.Arrays;
import java.util.Collections;
import java.util.PriorityQueue;
public class Test07 {
public static void main(String[] args) {
String[] operations =
//{"I 16", "I -5643", "D -1", "D 1", "D 1", "I 123", "D -1"};
//{"I 7", "I 5", "I -5", "D -1"};
//{"I 16","D 1"};
{"I -45", "I 653", "D 1", "I -642", "I 45", "I 97", "D 1", "D -1", "I 333"};
System.out.println(Arrays.toString(solution(operations)));
}
public static int[] solution(String[] operations) {
int[] answer = new int[2];
String[] commands = {"D 1", "D -1"};
PriorityQueue<Integer> pq_asc = new PriorityQueue<>(); // min heap
PriorityQueue<Integer> pq_desc = new PriorityQueue<>(Collections.reverseOrder()); // max heap
for (int i = 0; i < operations.length; i++) {
String op = operations[i];
if (op.startsWith("I")) {
int num = Integer.parseInt(op.split(" ")[1]);
pq_asc.add(num);
pq_desc.add(num);
} else if (op.equals(commands[0])) {
if (!pq_desc.isEmpty()) {
int max = pq_desc.poll();
pq_asc.remove(max);
}
} else if (op.equals(commands[1])) {
if (!pq_asc.isEmpty()) {
int min = pq_asc.poll();
pq_desc.remove(min);
}
}
}
int max = pq_desc.isEmpty() ? 0 : pq_desc.poll();
int min = pq_asc.isEmpty() ? 0 : pq_asc.poll();
answer[0] = max;
answer[1] = min;
return answer;
}
}