본문 바로가기
백준알고리즘

백준 1927 Java 최소 힙(Heap)

by tiit 2020. 6. 9.
반응형

package algo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class BJ_1927 {

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

        MinHeap h = new MinHeap(100001);

        for(int i=0; i<N; i++) {
            int x = Integer.parseInt(br.readLine());

            if(x == 0) {
                System.out.println(h.delete());

            }else { //자연수일 때는 insert 메서드에 x 더해준다 
                h.insert(x);
            }

        }

    }

    private static class MinHeap {

        int heap[];
        int size;

        public MinHeap(int size) {
            heap = new int[size];
        }

        public void insert(int x) {
            heap[++size] = x;    //heap[1] = x 넣어줌

            for(int i=size; i>1; i/=2) {
                if(heap[i/2] > heap[i]) {    //새로들어온 자식이랑 부모랑 비교함 
                    swap(i/2, i);
                }else {
                    break;
                }
            }
        }//insert 할 때마다 min값이 heap[1]에 들어간다. 

        public int delete() {    //입력값이 0일때  delete 실행 결과 출력 
                                //출력한 최소값 삭제 
            if(size == 0) {
                return 0;
            }

            int root = heap[1]; 
            heap[1] = heap[size]; //루트에 마지막 값 넣어줌 ,최소값 출력 했으니깐 
            size--;                  // 값 하나 뺐으니 사이즈도 하나 빼줌     

            for(int i=1; i*2<=size;) { 
                if(heap[i] < heap[i*2] && heap[i] < heap[i*2+1]) {//부모 노드가 왼, 오 자식 보다 작으면 바꿀 필요 없음 
                    break;

                }else if(heap[i*2] < heap[i*2+1]) {    //왼이 오보다 작으면
                    swap(i, i*2);                    // 부모랑 왼이랑 바꾼다 
                    i = i*2;                        
                }else {
                    swap(i, i*2+1);
                    i = i*2+1;
                }
            }
            return root;
        }

        public void swap(int a, int b) {
            int temp = heap[a];
            heap[a] = heap[b];
            heap[b] = temp;
        }


    }
}

// https://baelanche.tistory.com/131
// https://blog.naver.com/zzang9ha/221771852840

힙 이제 완벽하게 안다^^ㅎㅎ

반응형

'백준알고리즘' 카테고리의 다른 글

백준 1914 하노이 탑 JAVA  (0) 2020.06.29
백준 11403 경로 찾기 JAVA BFS  (0) 2020.06.28
백준 9252번 LCS 2 런타임 에러  (0) 2020.06.03
백준 JAVA 11812 K진 트리  (0) 2020.05.10
백준 1926 그림[BFS]  (0) 2020.04.23

댓글