카테고리 없음
백준 Java | BOJ 11279 최대 힙
토마토.
2023. 2. 1. 14:53
package DAY03.P11279;
import java.io.*;
import java.util.ArrayList;
public class Main {
public static int N;
public static ArrayList<Integer> max_heap;
public static void main(String[] args) throws IOException {
System.setIn(new FileInputStream("src/DAY03/P11279/input.txt"));
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(bf.readLine());
max_heap = new ArrayList<>();
for (int i=0;i<N;i++){
int x = Integer.parseInt(bf.readLine());
if (x == 0){
if (max_heap.isEmpty()){
System.out.println(0);
} else {
System.out.println(max_heap.get(0));
int last_element = max_heap.get(max_heap.size()-1);
max_heap.set(0, last_element);
max_heap.remove(max_heap.size()-1);
make_heap_delete();
}
} else {
max_heap.add(x);
make_heap_insert();
}
// System.out.println(max_heap.toString());
}
}
public static void make_heap_delete(){
int parent = 0;
if (max_heap.size() == 2){
int left_child = 1;
if (max_heap.get(left_child) > max_heap.get(parent)){
int parent_value = max_heap.get(parent);
int left_value = max_heap.get(left_child);
max_heap.set(left_child, parent_value);
max_heap.set(parent, left_value);
}
} else {
int left_child = 1;
int right_child = 2;
while (right_child < max_heap.size()){
int parent_value = max_heap.get(parent);
int left_value = max_heap.get(left_child);
int right_value = max_heap.get(right_child);
if (parent_value < left_value || parent_value < right_value){
if (left_value < right_value){
max_heap.set(parent, right_value);
max_heap.set(right_child, parent_value);
parent = right_child;
left_child = parent * 2;
right_child = parent * 2 + 1;
} else {
max_heap.set(parent, left_value);
max_heap.set(left_child, parent_value);
parent = left_child;
left_child = parent * 2;
right_child = parent * 2 + 1;
}
} else {
break;
}
}
if (left_child < max_heap.size()){
if (max_heap.get(left_child) > max_heap.get(parent)){
int parent_value = max_heap.get(parent);
int left_value = max_heap.get(left_child);
max_heap.set(left_child, parent_value);
max_heap.set(parent, left_value);
}
}
}
}
public static void make_heap_insert(){
int child = max_heap.size()-1;
int parent = child / 2;
while (child != 0 && max_heap.get(parent) < max_heap.get(child)){
int child_value = max_heap.get(child);
int parent_value = max_heap.get(parent);
max_heap.set(parent, child_value);
max_heap.set(child, parent_value);
child = parent;
parent = child / 2;
}
}
}