이번 문제는 PriorityQueue
의 정렬을 간단하게 변경해보는 문제였다.
comapreTo
메서드를 오버라이딩해서 두 값의 절대값이 같을 때는 오름차순으로 정렬해주고, 다를 때는 절대값의 크기 순으로 정렬해주는 간단한 문제였다.
참고 블로그 : https://st-lab.tistory.com/243
(Comparable
과Comparator
의 이해)
여기서는 Comparable
인터페이스의 compareTo
메서드를 오버라이딩해서 원하는 결과로 정렬을 구현할 수 있다.
보다 간단하게 작성하기 위해 람다 식으로 작성했다.
문제의 구현 난이도는 어렵지 않았지만, 구조를 이해하는데 보다 많은 시간을 들였었다. 다음의 나올 정렬 문제에서는 보다 빠르게 구현할 수 있을 것 같다!!
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int n = Integer.parseInt(br.readLine());
PriorityQueue<Integer> absHeap = new PriorityQueue<>((o1, o2) -> {
if(Math.abs(o1) == Math.abs(o2)){
return o1-o2;
}
return Math.abs(o1)-Math.abs(o2);
});
for(int i=0;i<n;i++){
int x = Integer.parseInt(br.readLine());
if(x!=0){
absHeap.add(x);
} else {
if(absHeap.isEmpty()){
sb.append(0).append("\n");
} else {
sb.append(absHeap.remove()).append("\n");
}
}
}
System.out.println(sb);
}
}