๐ก ์ด๋ฒ์๋ ์ฐ์ ์์ ํ๋ฅผ ๊ตฌํ ํ๋ ๋ฒ์ ๋ฐฐ์๋ณด์๋ค.
๋ฌธ์
๐ก ์ฐ์ ์์ ํ ๋ฐฉ์์ผ๋ก ํ๋ฅผ ๋ง๋์์ค.
๋น์ฐํ ์๋ ๋ฌธ์ ๊ธฐ์ ๋์ถฉ ๋ด๊ฐ ๋ง๋ค์๋ค.
ํด๋ต
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define MAX_SIZE 10000
void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
typedef struct priorityQueue {
int heap[MAX_SIZE];
int count;
} priorityQueue;
void push(priorityQueue *pq, int data) {
if (pq->count >= MAX_SIZE) {
return ;
}
pq->heap[pq->count] = data;
int now = pq->count;
int parent = (pq->count - 1) / 2;
while (now > 0 && pq->heap[now] > pq->heap[parent]) {
swap(&pq->heap[now], &pq->heap[parent]);
now = parent;
parent = (parent - 1) / 2;
}
pq->count++;
}
int pop(priorityQueue *pq) {
if (pq->count <= 0) {
return -9999;
}
int res = pq->heap[0];
pq->count--;
pq->heap[0] = pq->heap[pq->count];
int now = 0;
int leftChild = 1;
int rightChild = 2;
int target = now;
while (leftChild < pq->count) {
if (pq->heap[target] < pq->heap[leftChild]) {
target = leftChild;
}
if (pq->heap[target] < pq->heap[rightChild] && rightChild < pq->count) {
target = rightChild;
}
if (target == now) {
break;
}
else {
swap(&pq->heap[now], &pq->heap[target]);
now = target;
leftChild = now * 2 + 1;
rightChild = now * 2 + 2;
}
}
return res;
}
int main(void) {
int n, data;
scanf("%d", &n);
priorityQueue pq;
pq.count = 0;
for (int i = 0 ; i < n ; i++) {
scanf("%d", &data);
push(&pq, data);
}
for (int i = 0 ; i < n ; i++) {
int data = pop(&pq);
printf("%d ", data);
}
return 0;
}
์ค๋ช
์ฐ์ ์์ ํ๋?
- ‘์ฐ์ ์์’๋ฅผ ๊ฐ์ง ๋ฐ์ดํฐ๋ค์ ์ ์ฅํ๋ ํ๋ฅผ ์๋ฏธํ๋ค.
- ๋ฐ์ดํฐ๋ฅผ ๊บผ๋ผ ๋ ์ฐ์ ์์๊ฐ ๋์ ๋ฐ์ดํฐ๊ฐ ๋จผ์ ๋์จ๋ค๋ ํน์ง์ด ์๋ค.
- ์ผ๋ฐ์ ์ธ ํ๋ ์ ํ์ ์ธ ํํ๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ ํ๋ ํธ๋ฆฌ(Tree) ๊ตฌ์กฐ๋ก ๋ณด๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ด๋ค.
- ์ผ๋ฐ์ ์ผ๋ก ์ฐ์ ์์ ํ๋ ์ต๋ ํ์ ์ด์ฉํด ๊ตฌํํ๋ค.
- ์ฐ์ ์์ ํ์ ์ฝ์ ๊ณผ ์ญ์ ๋ก ํญ์ ๋ถ๋ชจ ๋ ธ๋๊ฐ ์์ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ํฌ๊ฒ ํ๋ค. (์ํฅ์, ํํฅ์)
์ต๋ ํ์ด๋?
- ์ต๋ ํ์ ๋ถ๋ชจ ๋ ธ๋๊ฐ ์์ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ํฐ ์์ ์ด์ง ํธ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค.
์ฐ์ ์์ ํ ์ง์
typedef struct priorityQueue {
int heap[MAX_SIZE];
int count;
} priorityQueue;
์ต๋ ํ์ ๊ตฌ์ฑํ๊ธฐ ์ํด int heap[MAX_SIZE] ๋ก ์ด๊ธฐํํด์ค๋ค.
push ํจ์
void push(priorityQueue *pq, int data) {
if (pq->count >= MAX_SIZE) { // pq์ count๊ฐ MAX_SIZE์ ๊ฐ๊ฑฐ๋ ๋ง์ผ๋ฉด push ํ์ง ์๋๋ค.
return ;
}
pq->heap[pq->count] = data; // ํญ์ ์์ ์ด์งํธ๋ฆฌ์ ๋ง์ง๋ง ์์๋ก ๋ค์ด๊ฐ๊ฒ ๋๋ค.
int now = pq->count; // now = ์ฝ์
๋ ์ ๋ฐ์ดํฐ์ ๋ํ ์ธ๋ฑ์ค
int parent = (pq->count - 1) / 2; // now์ 1์ ๋นผ๊ณ 2๋ก ๋๋ ๊ฐ
// ์ ์์๋ฅผ ์ฝ์
ํ ์ดํ์ ์ํฅ์์ผ๋ก ํ์ ๊ตฌ์ฑํ๋ค.
// ์์ ์ ์์น๊ฐ ๋ถ๋ชจ๋ณด๋ค ํฌ๋ค๋ฉด ์ค์์ผ๋ก ๋ฐ๊ฟ์ค๋ค.
while (now > 0 && pq->heap[now] > pq->heap[parent]) {
swap(&pq->heap[now], &pq->heap[parent]);
now = parent;
parent = (parent - 1) / 2;
}
pq->count++;
- pq->heap[now] > pq->heap[parent]
- ์ int now = pq->count; ์ int parent = (pq->count - 1) / 2; ์์ ๊ตฌํ now ์ parent์ heap์ ํ์ธํ์ฌ ์ด๋ฒ์ ๋ค์ด์จ ๋ฐ์ดํฐ๊ฐ ๋ ํฌ๋ค๋ฉด ํฌ์ง ์์ ๋ ๊น์ง swapํ์ฌ ์์น๋ฅผ ๋ฐ๊ฟ์ค๋ค.
pop ํจ์
int pop(priorityQueue *pq) {
if (pq->count <= 0) { // ๋์ด์ ์ถ์ถํ ์์๊ฐ ์๋ค๋ฉด return -9999 ํด์ค๋ค.
return -9999;
}
int res = pq->heap[0]; // ์ถ์ถํ ์์, ์ฆ ๋ฃจํธ ๋
ธ๋
pq->count--;
pq->heap[0] = pq->heap[pq->count]; // ํด๋น ๋ฃจํธ๋
ธ๋์ ๊ฐ์ฅ ๋ง์ง๋ง ์์๋ฅผ ๋ฃ์
int now = 0;
int leftChild = 1;
int rightChild = 2;
int target = now; // ์๊ธฐ ์์
// ์ ์์๋ฅผ ์ถ์ถํ ์ดํ์ ํํฅ์์ผ๋ก ํ์ ๊ตฌ์ฑํ๋ค. ์์๊ฐ ์กด์ฌํ ๋๋ง ๋ฐ๋ณตํ๋ค.
while (leftChild < pq->count) {
// ํ๊ฒ ์์๊ฐ leftChild๋ณด๋ค ์๋ค๋ฉด target์ leftChild๋ก ๋ฐ๊ฟ์ค๋ค.
if (pq->heap[target] < pq->heap[leftChild]) {
target = leftChild;
}
// leftChild๊ฐ rightChild๋ณด๋ค ์๋ค๋ฉด target์ rightChild๋ก ๋ฐ๊ฟ์ค๋ค.
// index๋ฅผ ๋ฒ์ด๋์ง ์๊ฒ ํ๊ธฐ ์ํด์ rightChild๊ฐ ํ์ฌ ์์์ ๊ฐ์๋ณด๋ค ์์ ๋๊น์ง๋ง ๊ฒ์ฌํ ์ ์๊ฒ ํ๋ค.
if (pq->heap[target] < pq->heap[rightChild] && rightChild < pq->count) {
target = rightChild;
}
// ๋ ์ด์ ๋ด๋ ค๊ฐ์ง ์์๋ ๋ ๋ ์ข
๋ฃ
if (target == now) {
break;
}
else {
swap(&pq->heap[now], &pq->heap[target]);
now = target;
leftChild = now * 2 + 1;
rightChild = now * 2 + 2;
}
}
return res;
}
- int res = pq->heap[0]; ์์ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ถ์ถํ๋ ์ด์ ๋ ์ฐ์ ์์ ํ์ด๊ธฐ ๋๋ฌธ์ ์ฐ์ ์์๊ฐ ํฐ ์์๋ถํฐ ์ถ์ถํ๊ธฐ ๋๋ฌธ์ด๋ค.
- pop ํจ์๊ฐ push ํจ์๋ณด๋ค ๋ ๋ณต์กํ ๋๋์ด๋ค. ์ฃผ์์ ์ ์ฝ์ด๋ณด์.
main ํจ์
int main(void) {
int n, data;
scanf("%d", &n);
priorityQueue pq;
pq.count = 0;
for (int i = 0 ; i < n ; i++) {
scanf("%d", &data);
push(&pq, data);
}
for (int i = 0 ; i < n ; i++) {
int data = pop(&pq);
printf("%d ", data);
}
return 0;
}
main ํจ์๋ ๋ณ ๊ฑฐ ์๋ค.
๋ฐ์ ์์ ๊ฐ์๋ฅผ ์ ํ๊ณ , count๋ฅผ ์ด๊ธฐํ ํ ๋ค ์ฐ์ ์์ ํ์ push ํด์ฃผ๊ณ , ๋ค์ pop ํด์ฃผ๋ ๊ฐ๋จํ ์ฝ๋์ด๋ค.
๋ง์น๋ฉฐ..
์ด์งํธ๋ฆฌ๋ ๋ฐฑํ๋ก ์ดํด๋ฅผ ํ์ง ๋ชปํ์๋๋ฐ ์ฐ์ ์์ ํ๋ฅผ ๋ฐฑํ๋ก ์ดํดํ๋ ๊ฒ์ ์ฝ์ง ์์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
์์ด๋ฆฌ ์ด๋ ค์ ํฌ์ฑ์ด์ธ์ง…