코딩/코딩테스트
백준 11286번: 절댓값 힙
yesman9
2024. 7. 2. 19:01
이 문제에서는 출력할 때 두 가지 규칙을 갖는다.
- 배열에서 절댓값이 가장 작은 수가 우선순위를 갖는다.
- 절댓값이 같으면 가장 작은 수가 우선순위를 갖는다.
자바의 PriorutyQueue를 활용하면 쉽게 풀이할 수 있다.
PriorityQueue는 선언할 때, Comparator객체를 이용하여 사용자 정의의 우선순위 규칙을 부여할 수 있다.
Java | Priority Queue(우선순위 큐) 와 Comparable, Comparator
우선순위 큐는 먼저 들어간 데이터가 먼저 나오는 일반적인 큐와는 다르게 데이터를 꺼낼 때 우선순위가 가장 높은 데이터가 가장 먼자 나온다.우선순위 큐는 힙을 이용하여 구현하는 것이 일
velog.io
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Comparator;
import java.util.List;
import java.util.PriorityQueue;
public class Main {
public static void main(String[] args) throws IOException {
// 입력
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
PriorityQueue<Integer> queue = new PriorityQueue<Integer>(new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
if (Math.abs(o1) == Math.abs(o2)) {
return o1 - o2;
} else {
return Math.abs(o1) - Math.abs(o2);
}
}
});
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
// 입력
int input = Integer.parseInt(br.readLine());
// 입력이 0인 경우
if (input == 0) {
// 입력이 0인데 queue가 비어있으면
if (queue.isEmpty()) {
sb.append("0\n");
continue;
}
// 입력이 0이고 queue가 비어있지 않으면
sb.append(queue.poll() + "\n");
} else { // 입력이 0이 아닌 경우
queue.add(input);
}
}
bw.write(sb.toString());
bw.flush();
bw.close();
br.close();
}
}