728x90
https://www.acmicpc.net/problem/11286
11286번: 절댓값 힙
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
#include <stdio.h> // 절댓값 힙
#include <stdlib.h>
typedef struct
{
int data;
}node;
typedef struct
{
node arr[100001];
int size;
}HEAP;
void push(HEAP* h, int num)
{
int i;
i = ++(h->size);
while (i != 1 && (abs(num) <= abs(h->arr[i / 2].data)))
{
// 절댓값이 같을 경우 처리(더 작은 숫자가 이진트리 구조에서 위로 가야함)
if (abs(num) == abs(h->arr[i / 2].data) && (num > h->arr[i / 2].data))
break;
h->arr[i].data = h->arr[i / 2].data;
i /= 2;
}
h->arr[i].data = num;
}
int pop(HEAP* h)
{
node root, temp;
root.data = h->arr[1].data;
temp.data = h->arr[(h->size)--].data;
int parent = 1;
int child = 2;
while (child <= h->size)
{
if (child < h->size)
{
if ((abs(h->arr[child].data) > abs(h->arr[child + 1].data)))
{
child++;
}
// 절댓값이 같을 경우 처리
else if ((abs(h->arr[child].data) == abs(h->arr[child + 1].data)) && h->arr[child].data > h->arr[child + 1].data)
{
child++;
}
}
if (abs(temp.data) < abs(h->arr[child].data))
{
break;
}
else if (abs(temp.data) == abs(h->arr[child].data) && temp.data < h->arr[child].data)
{
break;
}
h->arr[parent].data = h->arr[child].data;
parent = child;
child *= 2;
}
h->arr[parent].data = temp.data;
return root.data;
}
int main()
{
int n;
scanf("%d", &n);
HEAP h;
h.size = 0;
for (int i = 0; i < n; i++)
{
int num;
scanf("%d", &num);
if (num == 0 && h.size == 0)
{
printf("%d\n", 0);
}
else if (num == 0 && h.size != 0)
{
printf("%d\n", pop(&h));
}
else
{
push(&h, num);
}
}
return 0;
}
MEMO
-- 최소힙, 최대힙과 유사한 문제
-- 절댓값의 경우를 생각해서 따로 처리해주는 부분을 추가
!! 힙 개념 어느정도 익힘 !!
728x90
728x90
'백준[baekjoon] > C언어' 카테고리의 다른 글
백준(baekjoon) [C] - 5430번: AC (0) | 2023.01.31 |
---|---|
백준(baekjoon) [C] - 1715번: 카드 정렬하기 (0) | 2023.01.30 |
백준(baekjoon) [C] - 1620번: 나는야 포켓몬 마스터 이다솜 (0) | 2023.01.28 |
백준(baekjoon) [C] - 1927번: 최소 힙 (0) | 2023.01.27 |
백준(baekjoon) [C] - 1010번: 다리 놓기 (0) | 2023.01.27 |