카테고리 없음

백준 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;
        }
    }
}