n(질의 개수)
우선순위 큐 선언
- 절댓값 기준으로 정렬되도록 설정
- 단, 절댓값이 같으면 음수 우선 정렬
for n 반복:
요청이 0일 때: 큐가 비어 있으면 0, 비어 있지 않으면 큐의 front값 출력
요청이 1일 때: 새로운 데이터를 우선순위 큐에 더하기
import sys
from queue import PriorityQueue
input = sys.stdin.readline
n = int(input())
myQueue = PriorityQueue()
result = []
for i in range(n):
request = int(input()) # 요청 숫자
if request == 0: # 요청 숫자가 0이면
if myQueue.empty(): # 큐가 비어있으면 0 출력
result.append("0")
else: # 큐가 비어있지 않으면
temp = myQueue.get() # 튜플 get
result.append(str((temp[1]))) # 절댓값이 아닌 request 값 출력
else:
myQueue.put((abs(request), request))
print("\n".join(result))
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.Queue;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
/**
* 1. 절댓값이 작은 데이터 우선
* 2. 절댓값이 같다면 음수 우선
*/
Queue<Integer> qu = new PriorityQueue<>((o1, o2) -> {
/**
* compare(T o1, T o2)
* o1이 o2보다 앞에 오게 하려면 음수를 리턴 -> o1이 우선순위 높게
* o1이 o2보다 뒤에 오게 하려면 양수를 리턴 -> o2가 우선순위 높게
* o1 = -1(음수), o2 = 1(양수)로 외워보자.
*/
int n1 = Math.abs(o1);
int n2 = Math.abs(o2);
//2. 절댓값이 같다면 음수 우선
//만약 절댓값으로 바꾸기 전 o1이 o2보다 크다면 o1=양수, o2=음수 -> o2가 우선순위가 높아야 하므로 양수 리턴
//만약 절댓값으로 바꾸기 전 o1이 o2보다 크지 않다면 o1=음수, o2=양수 -> o1이 우선순위가 높아야 하므로 음수 리턴
if (n1 == n2) {
return o1 > o2 ? 1 : -1;
}
//1. 절댓값이 작은 데이터 우선
//만약 n1 - n2 > 0 라면(양수), n1이 더 크다. 즉, o2의 절댓값이 o1의 절댓값보다 작다. -> o1, o2 중 o2가 우선
//만약 n1 - n2 < 0 라면(음수), n2가 더 크다. 즉, o1의 절댓값이 o2의 절댓값보다 작다. -> o1, o2 중 o1이 우선
return n1 - n2;
});
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
int request = Integer.parseInt(br.readLine());
if (request == 0) { //요청 숫자가 0이면
if (qu.isEmpty()) { //큐가 비어있는지 확인
sb.append(0).append("\n");//비어있다면 0을 출력
} else {//비어있지 않으면 값을 제거하고 출력
sb.append(qu.poll()).append("\n");
}
} else { //요청 숫자가 0이 아니면 요청 숫자를 우선순위 큐에 저장
qu.add(request);
}
}
System.out.println(sb);
}
}