반응형
1) 절댓값이 가장 작으면 우선순위가 높다.
2) 같은 절댓값인 경우는 음수가 우선순위가 높다.
따라서, 최악의 값은 양수 중에 가장 큰 값이 된다.
if / else if의 비교를 함수로 만들면 편하다.
heap[hn--] = 0x7fff0000; /* 최악의 값은 양수 중 가장 큰 값 */
int abs(int x)
{
return (x > 0) ? x : -x;
}
int isMin(int a, int b)
{
if (abs(a) < abs(b)) return 1; /* 절댓값 중 작으면 우선순위가 크다 */
if (abs(a) == abs(b) && a < b) return 1; /* 같은 절댓값이면 음수가 우선순위가 크다 */
return 0;
}
if (heap[i / 2] <= heap[i]) break;
→ if (isMin(heap[i / 2], heap[i])) break; 로 바꿔서 사용하면 된다.
#include <stdio.h>
int N;
int heap[100100];
int hn;
int abs(int x)
{
return (x > 0) ? x : -x;
}
int isMin(int a, int b)
{
if (abs(a) < abs(b)) return 1;
if (abs(a) == abs(b) && a < b) return 1;
return 0;
}
int pop(int* heap, int& hn)
{
register int tmp, ret;
ret = heap[1];
heap[1] = heap[hn];
heap[hn--] = 0x7fff0000;
for (register int i = 1; i * 2 <= hn;)
{
if (isMin(heap[i], heap[i * 2]) && isMin(heap[i], heap[i * 2 + 1])) break;
else if (isMin(heap[i * 2], heap[i * 2 + 1]))
{
tmp = heap[i * 2];
heap[i * 2] = heap[i];
heap[i] = tmp;
i = i * 2;
}
else
{
tmp = heap[i * 2 + 1];
heap[i * 2 + 1] = heap[i];
heap[i] = tmp;
i = i * 2 + 1;
}
}
return ret;
}
void push(int* heap, int& hn, int x)
{
register int tmp;
heap[++hn] = x;
for (register int i = hn; i > 1; i /= 2)
{
if (isMin(heap[i / 2], heap[i])) break;
tmp = heap[i / 2];
heap[i / 2] = heap[i];
heap[i] = tmp;
}
}
int main()
{
scanf("%d", &N);
for (int i = 0; i < N;i++)
{
int x;
scanf("%d", &x);
if (x) push(heap, hn, x);
else
{
if (hn) printf("%d\n", pop(heap, hn));
else printf("0\n");
}
}
return 0;
}
반응형
'알고리즘 > [PRO] 삼성 SW 역량 테스트 B형' 카테고리의 다른 글
BOJ 1655 : 가운데를 말해요 with 우선순위 큐 (1) | 2021.02.21 |
---|---|
BOJ 10825 : 국영수 (1) | 2021.02.21 |
BOJ 11279 : 최대 힙 (1) | 2021.02.21 |
BOJ 1927 : 최소 힙 (3) | 2021.02.21 |
B형 필수 : 우선순위 큐 Priority Queue (0) | 2021.02.19 |
댓글