본문 바로가기

알고리즘/BOJ

1927번(우선순위 큐 다시풀기)

1927번 - 최소힙


최대힙과 비슷한 방식이었지만, 힙에 정수값이 들어온다는 점이 달랐다.


따라서 최대힙에서는 빈 노드가 0 이라, 어떤 노드가 추가 삭제 되도, 빈 노드에 대해서 생각할 필요가 없었다.


어차피 들어오는 값이 자연수고, 이는 0보다는 항상 크기 때문에.


하지만 최소힙에서는 비어있는 노드 값이0 이고, 이는 모든 자연수보다 작기 때문에, 비어있는 노드도 체크해줘야 했다.


이는 pop 할 때, 


왼쪽 자식 노드가 빈 경우, 오른쪽 자식 노드가 빈 경우, 둘다 빈 경우, 둘다 있는 경우를 모두 고려해서 문제를 풀었다.


(priorty_queue 를 이용하면 너무나 쉬운데.... )


<정답 코드>


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
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include<iostream>
 
using namespace std;
int N;
int heap[100001];
int last = 0;
void push(int n)
{
    heap[++last] = n;
 
    for (int i = last; i > 1; i /= 2)
    {
        if (heap[i] < heap[i / 2])
        {
            swap(heap[i], heap[i / 2]);
        }
        else
        {
            break;
        }
    }
 
}
void pop()
{
    printf("%d\n", heap[1]);
 
    if (last == 0)
    {
        return;
    }
 
    swap(heap[last], heap[1]);
    heap[last--= 0;
 
    for (int i = 1; i * 2 <= last;)
    {
        if (heap[i * 2== 0 && heap[i * 2== 0)
        {
            break;
        }
        else
        {
            if (heap[i * 2!= 0 && heap[i * 2 + 1== 0)
            {
                if (heap[i * 2< heap[i])
                {
                    swap(heap[i * 2], heap[i]);
                    i = i * 2;
                }
                else
                {
                    break;
                }
            }
            else if (heap[i * 2== 0 && heap[i * 2 + 1!= 0)
            {
                if (heap[i * 2+1< heap[i])
                {
                    swap(heap[i * 2+1], heap[i]);
                    i = i * 2 + 1;
                }
                else
                {
                    break;
                }
            }
            else
            {
                if (heap[i] < heap[i * 2&& heap[i] < heap[i * 2 + 1])
                {
                    break;
                }
                else
                {
                    if (heap[i * 2< heap[i * 2 + 1])
                    {
                        swap(heap[i * 2], heap[i]);
                        i = i * 2;
                    }
                    else
                    {
                        swap(heap[i * 2 + 1], heap[i]);
                        i = i * 2 + 1;
                    }
                }
            }
        }
    }
 
 
}
int main()
{
    cin >> N;
    while (N--)
    {
        int op;
        cin >> op;
 
        if (op == 0)
        {
            pop();
        }
        else
        {
            push(op);
        }
    }
 
    return 0;
}
cs


반응형

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

7785번  (0) 2017.12.21
11286번(우선순위큐 다시풀기)  (0) 2017.12.21
11279번(우선순위 큐 다시풀기)  (0) 2017.12.20
4195번  (0) 2017.12.20
1976번  (0) 2017.12.19