0. 문제
1. 문제 이해
- Heap
- Priority Queue
- Comparator
2. 제출
가. Priority Queue로 풀기
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
public class BOJ11286 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
PriorityQueue<Integer> pq = new PriorityQueue<>(new MyComparator());
StringBuffer sb =new StringBuffer();
int N = Integer.parseInt(st.nextToken());
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken());
if(num==0) {
Integer tmp = pq.poll();
tmp = tmp==null ? 0 : tmp;
sb.append(tmp).append("\n");
}else {
pq.offer(num);
}
}
System.out.println(sb.toString());
br.close();
}
static class MyComparator implements Comparator<Integer>{
@Override
public int compare(Integer o1, Integer o2) {
int ao1 = Math.abs(o1);
int ao2 = Math.abs(o2);
if(ao1 == ao2) {
return Integer.compare(o1, o2);
}
return Integer.compare(ao1, ao2);
}
}
}
Code language: JavaScript (javascript)
나. Heap 직접 구현
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ11286_2 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuffer sb =new StringBuffer();
int N = Integer.parseInt(st.nextToken());
MyHeap myHeap = new MyHeap(N);
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken());
if(num==0) {
Node tmp = myHeap.getMin();
int ret = tmp==null ? 0 : tmp.value;
sb.append(ret).append("\n");
}else {
myHeap.add(new Node(num));
}
}
System.out.println(sb.toString());
br.close();
}
static class MyHeap {
Node[] arr;
int size;
int root = 1;
int last = 0;
MyHeap(int size){
this.size = size;
this.arr = new Node[size+1];
}
public void add(Node node) {
arr[++last] = node;
int idx = last;
while(idx>1 && myCompare(idx, idx/2)) {
swap(idx, idx/2);
idx /= 2;
}
}
private boolean myCompare(int from, int to) {
int fromV = arr[from].value;
int toV = arr[to].value;
if(Math.abs(fromV) == Math.abs(toV))
return fromV < toV;
return Math.abs(fromV) < Math.abs(toV);
}
public Node getMin() {
if(last < 1) return null;
Node ret = arr[root];
arr[root] = arr[last];
arr[last] = null;
last--;
int idx = root;
while(idx <= last/2) {
int child;
if(arr[idx*2+1]==null) {
child = idx*2;
}else {
child = myCompare(idx*2, idx*2+1) ? idx*2 : idx*2+1 ;
}
if(myCompare(child, idx)) {
swap(child, idx);
idx = child;
}else {
break;
}
}
return ret;
}
private void swap(int idx1, int idx2) {
Node tmp = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = tmp;
}
@Override
public String toString() {
StringBuffer sb = new StringBuffer();
for(int i=1; i<=last; i++) {
sb.append(arr[i].value).append(" ");
}
return sb.toString();
}
}
static class Node {
int value;
public Node(int value) {
this.value = value;
}
}
}
Code language: JavaScript (javascript)