기록하는 개발자

[백준][JAVA] 11279 : 최대 힙 본문

Algorithm

[백준][JAVA] 11279 : 최대 힙

밍맹030 2021. 7. 21. 16:22
728x90

https://www.acmicpc.net/problem/11279

 

11279번: 최대 힙

첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가

www.acmicpc.net

최대 힙(Max Heap)

  • 최대 트리는 각 노드의 키 값이(자식 노드가 있다면) 그 자식의 키값보다 크거나 같은(작지 않은) 트리이다.
  • 최대 힙은 최대 트리이면서 완전 이진 트리이다.

참고 :  https://juhee-maeng.tistory.com/94

 

[자료구조] 힙(Heap)이란? 최대힙(Max Heap)과 최소힙(Min Heap)

힙(Heap) 최대 힙(Max Heap) 최소 힙(Min Heap) 1. 최대 힙(Max Heap) 최대 트리(Max Tree)는 각 노드의 키(Key)값이 (자식 노드가 있다면) 그 자식의 키(Key)값보다 작지 않은(=크거나 같은) 트리이다. 최대 힙(M..

juhee-maeng.tistory.com

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class Main {
    public static class maxHeap{
        private ArrayList<Integer> heap;
        
        public maxHeap(){
            heap=new ArrayList<>();
            heap.add(1000000);
        }

        public void insert(int val){
            heap.add(val);
            int p=heap.size()-1;

            while(p>1 && heap.get(p/2)<heap.get(p)) {
                int temp = heap.get(p / 2);
                heap.set(p / 2, heap.get(p));
                heap.set(p, temp);
                p /= 2;
            }
        }

        public int delete(){
            if(heap.size()-1<1) return 0;
            
            int deleteItem = heap.get(1);
            heap.set(1, heap.get(heap.size()-1));
            heap.remove(heap.size()-1);

            int p=1;
            
            while((p*2)<heap.size()){
                int max=heap.get(p*2);
                int maxP=p*2;
                if(((p*2+1)<heap.size())&& max<heap.get(p*2+1)){
                    max = heap.get(p*2+1);
                    maxP=p*2+1;
                }

                if(heap.get(p)>max) break;

                int tmp=heap.get(p);
                heap.set(p, heap.get(maxP));
                heap.set(maxP, tmp);
                p =maxP;
            }
            return deleteItem;
        }
    }

    public static void main(String[] args)throws Exception{
        BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
        int N=Integer.parseInt(br.readLine());
        maxHeap max=new maxHeap();

        for(int i=0; i<N; i++){
            int val=Integer.parseInt(br.readLine());
            if(val==0) System.out.println(max.delete());
            else max.insert(val);
        }
    }
}

 

728x90

'Algorithm' 카테고리의 다른 글

[백준][JAVA] 11286 : 절댓값 힙  (0) 2021.07.23
[백준][JAVA] 1991 : 트리 순회  (0) 2021.07.21
[백준][JAVA] 1874 : 최소 힙  (0) 2021.07.21
[백준][JAVA] 1874 : 스택 수열  (0) 2021.07.11
[백준][JAVA] 10828 : 스택  (0) 2021.07.11