본문 바로가기
공부/알고리즘

백준1927_최소힙

by 미네밍 2016. 11. 15.

문제

널리 잘 알려진 자료구조 중 최소 힙이라는 것이 있다. 최소 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 작성하시오.

  1. 배열에 자연수 x를 넣는다.
  2. 배열에서 가장 작은 값을 출력하고, 그 값을 배열에서 제거한다.

프로그램은 처음에 비어있는 배열에서 시작하게 된다.

입력

첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 가장 작은 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 자연수는 2^31보다 작다.

출력

입력에서 0이 주어진 회수만큼 답을 출력한다. 만약 배열이 비어 있는 경우인데 가장 작은 값을 출력하라고 한 경우에는 0을 출력하면 된다.

예제 입력 

9
0
12345678
1
2
0
0
0
0
32

예제 출력 

0
1
2
12345678
0


[코드]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
import java.util.Arrays;
import java.util.Scanner;
 
public class B1927_minHeap {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
 
        Scanner sc = new Scanner(System.in);
        int N = sc.nextInt(); // 전체 개수
        Heap h = new Heap(N);
        int Heap[] = new int[N];
        int out = 0;
 
        for (int i = 0; i < N; i++) {
            int num = sc.nextInt();
            if (num == 0)
                System.out.println(h.removeNode());
            else
                h.addNode(num);
        }
    }
}
 
class Heap {
    int heap[];
    int size = 0;
 
    public Heap(int n) {
        heap = new int[n];
    }
 
    public void addNode(int newInt) {
        //마지막에 먼저 넣고, 걔를 자식 노드랑 같이 비교하기
        int p;
        heap[size] = newInt;
        p = size;
        size++;
        while (p > 0 && heap[p] < heap[(p - 1/ 2]) {
            int temp = heap[p]; 
            heap[p] = heap[(p - 1/ 2];
            heap[(p - 1/ 2= temp;
            p = (p - 1/ 2;
        }
    }
 
    public boolean isEmpty() {
        if (size == 0)
            return true;
        else
            return false;
    }
 
    public int removeNode() {
 
        int rst;
        if (!isEmpty()) {
            rst = heap[0];
            heap[0= heap[--size];
            heap[size] = 0;
        } else {
            return 0;
        }
 
        arrange();
 
        return rst;
    }
 
    public void arrange() {
        int p = 0; // 루트 노드에서 부터 크기 비교 후 swap 해준다.
    
        while (p * 2 + 1 < size-1) {
            if (heap[p * 2 + 1> heap[p * 2 + 2]) {
                int temp = heap[p];
                heap[p] = heap[p * 2 + 1];
                heap[p * 2 + 1= temp;
                p = p * 2 + 1;
            } else {
                int temp = heap[p];
                heap[p] = heap[p * 2 + 2];
                heap[p * 2 + 2= temp;
                p = p * 2 + 2;
            }
        }
    }
}
cs


힙을 처음 배워봐서 인터넷에서 좀 참고해서 짜봤는데도

틀렸다고 계속 뜬다 ㅜ_ㅜ

그래도 일단은... 중간기록 ㅠㅠ

'공부 > 알고리즘' 카테고리의 다른 글

백준1149_RGB거리  (0) 2016.11.21
백준11403_경로찾기  (1) 2016.11.18
정렬 - 삽입, 퀵, 병합  (0) 2016.11.12
백준2252_줄 세우기  (0) 2016.11.08
백준1620_나는야 포켓몬 마스터 이다솜  (1) 2016.11.04

댓글