모든연산을처리한후큐가비어있으면 [0,0] 비어있지않으면 [최댓값, 최솟값]을 return 하도록 solution 함수를구현해주세요.
제한 사항
operations는 길이가 1 이상 1,000,000 이하인 문자열 배열입니다.
operations의 원소는 큐가 수행할 연산을 나타냅니다.
원소는 “명령어 데이터” 형식으로 주어집니다.
- 최댓값/최솟값을 삭제하는 연산에서 최댓값/최솟값이 둘 이상인 경우, 하나만 삭제합니다.
빈 큐에 데이터를 삭제하라는 연산이 주어질 경우, 해당 연산은 무시합니다.
입출력 예시
operations
return
["I 16", "I -5643", "D -1", "D 1", "D 1", "I 123", "D -1"]
[0,0]
["I -45", "I 653", "D 1", "I -642", "I 45", "I 97", "D 1", "D -1", "I 333"]
[333, -45]
문제 풀이
접근 방법
우선순위큐는 숫자가 작은 순으로 반환한다.
문제에서는 최댓값과 최솟값을 삭제하는 명령어가 있기때문에 큐를 최소, 최대 큐를 두개를 사용한다.
최대큐는 우선순위큐의 정렬순서를 반대로 만든다.
두개의 큐에 동시에 요소를 입력하기 때문에 삭제할때에도 동시에 삭제해야한다.
최대값을 삭제할때 삭제하는 요소를 최솟값 큐에서도 삭제한다.
코드
import java.util.Collections;
import java.util.PriorityQueue;
public class P_42628 {
private static int[] solution(String[] operations) {
// 우선순위 큐 선언 (가장 작은 숫자가 먼저 나온다)
PriorityQueue<Integer> minQ = new PriorityQueue<>();
// 최대 우선순위 큐를 위해 정렬순서를 변경한다.
PriorityQueue<Integer> maxQ = new PriorityQueue<>(Collections.reverseOrder());
String[] cmd;
int element;
for (String operation : operations) {
cmd = operation.split(" ");
if (cmd[0].equals("I")) {
element = Integer.parseInt(cmd[1]);
// 최소, 최대 큐에 삽입
minQ.add(element);
maxQ.add(element);
}
// 큐에 요소가 있을 때에만 D 연산 수행
if (!minQ.isEmpty()) {
if (cmd[0].equals("D")) {
// 두 개의 큐에서 같이 삭제 수행
if (Integer.parseInt(cmd[1])==1) {
minQ.remove(maxQ.poll());
} else {
maxQ.remove(minQ.poll());
}
}
}
}
// 큐가 비어있으면 [0,0] 반환, 아니면 [최댓값, 최솟값] 반환
return (minQ.isEmpty()) ? new int[]{0,0} : new int[]{maxQ.poll(), minQ.poll()};
}
}