문제
코드
import java.io.*;
public class q11279 {
static int heapSize = 0;
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[] maxHeap = new int[100000];
maxHeap[0] = 0;
int N = Integer.parseInt(br.readLine());
for(int i=0; i<N; i++) {
int input = Integer.parseInt(br.readLine());
if(input > 0) insertNode(maxHeap, input);
else if(input == 0) bw.write(popRoot(maxHeap)+"\n");
}
bw.flush();
}
public static void insertNode(int[] maxHeap, int v) {
maxHeap[++heapSize] = v;
if(heapSize == 1) return;
else {
int presentNodeIndex = heapSize;
while(true) {
int parentNodeIndex = presentNodeIndex / 2;
if(parentNodeIndex == 0) break;
if(maxHeap[presentNodeIndex] > maxHeap[parentNodeIndex]) {
swapNode(maxHeap, presentNodeIndex, parentNodeIndex);
presentNodeIndex = parentNodeIndex;
} else {
break;
}
}
}
}
public static int popRoot(int[] maxHeap) {
int rootNode = 0;
if(heapSize == 0) return rootNode;
else {
rootNode = maxHeap[1];
maxHeap[1] = maxHeap[heapSize--];
int presentNodeIndex = 1;
while (true) {
int childNodeIndex1 = presentNodeIndex*2;
int childNodeIndex2 = presentNodeIndex*2+1;
int changeNodeIndex;
if(childNodeIndex1 > heapSize) break;
if(childNodeIndex2 > heapSize) {
changeNodeIndex = childNodeIndex1;
}
else {
if(maxHeap[childNodeIndex1] > maxHeap[childNodeIndex2]) changeNodeIndex = childNodeIndex1;
else changeNodeIndex = childNodeIndex2;
}
if(maxHeap[presentNodeIndex] < maxHeap[changeNodeIndex]) {
swapNode(maxHeap, presentNodeIndex, changeNodeIndex);
presentNodeIndex = changeNodeIndex;
} else {
break;
}
}
}
return rootNode;
}
public static void swapNode(int[] maxHeap, int aNodeIndex, int bNodeIndex) {
int tempV = maxHeap[aNodeIndex];
maxHeap[aNodeIndex] = maxHeap[bNodeIndex];
maxHeap[bNodeIndex] = tempV;
}
}