Baekjoon 2751 (수 정렬하기 2)
Baekjoon 2751, 백준 2751 문제의 본인 풀이입니다!
문제는 아래의 링크에서 확인할 수 있습니다.
문제 보기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
typedef struct {
int heap[MAX_ELEMENT];
int heap_size;
} HeapType;
// 현재 요소의 개수가 heap_size인 힙 h에 data을 삽입한다.
void insert_heap(HeapType *h, int data) {
int i;
i = ++(h->heap_size); // 힙 크기를 하나 증가
// 트리를 거슬러 올라 가며 부모 노드와 비교하는 과정
// i가 루트 노드가 아니고,data 값이 부모노드(i/2)보다 작으면
while( (i!=1) && (data < h->heap[i/2])) {
h->heap[i] = h->heap[i/2];
i /= 2;
}
h->heap[i] = data;
}
int delete_heap(HeapType *h) {
if(h->heap_size == 0) return -1;
int ret = h->heap[1];
int temp = h->heap[(h->heap_size)--]; // 마지막 노드를 temp에 담고 heap_size를 1 줄임.
int parent = 1, child = 2;
while(child <= h->heap_size) {
// 현재 노드의 자식 노드 중 더 작은 자식 노드를 찾는다.
if( child < h->heap_size && h->heap[child] > h->heap[child+1] )
child++;
// 더 작은 자식 노드보다 마지막 노드가 작으면 while문 정지
if( temp <= h->heap[child] ) break;
// 그렇지 않으면, 부모 노드와 작은 자식 노드 교환
h->heap[parent] = h->heap[child];
parent = child;
child *= 2;
}
h->heap[parent] = temp;
return ret;
}
int main() {
int N, data;
scanf("%d",&N);
HeapType heap1;
heap1.heap_size = 0;
for(int i=0; i<N; i++){
scanf("%d",&data);
insert_heap(&heap1,data);
}
for(int i=0; i<N; i++) {
printf("%d\n", delete_heap(&heap1));
}
}
quick sort 등의 간편한 함수를 사용하지 않고, 직접 heap sort를 구현해 보았다.
while 문 내부의 if 문 조건이 하나 틀어져서 오류 찾는데 엄청 오래 걸렸다.
Baekjoon 2751 (수 정렬하기 2)
http://yxxshin.github.io/2020/03/13/2020-03-13-Baekjoon-2751/