8월 29일(화) - 자료 구조 (11279번)
11279번: 최대 힙
첫째 줄에 연산의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
최초 생각 정리
- 직전에 풀이했던 "1927번: 최소 힙" 문제와 사실상 동일하다
- 다만 최소 힙과 최대 힙의 차이가 있기때문에,
이전 풀이의 push함수와 pop함수안에 있는 부등호들을 모두 반대로 수정하면 풀이가 진행될 것으로 예상
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
문제점
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
풀이
(풀이참고 -> https://jicoding.tistory.com/99)
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable: 4996)
#include <stdio.h>
int heap[100001];
int hn = 0;
void swap(int i, int j)
{
int tmp = heap[i];
heap[i] = heap[j];
heap[j] = tmp;
}
void push(int x)
{
heap[++hn] = x;
for (int i = hn; i > 1; i /= 2)
{
if (heap[i] > heap[i / 2])
{
swap(i, i / 2);
}
else
{
break;
}
}
}
int pop(void)
{
int top = heap[1];
heap[1] = heap[hn];
heap[hn--] = 0;
int i = 1;
while (i * 2 <= hn)
{
// 자식이 1명일 경우
if (heap[i * 2 + 1] == 0)
{
if (heap[i] > heap[i * 2])
{
break;
}
else if (heap[i] < heap[i * 2])
{
swap(i, i * 2);
i = i * 2;
}
else
{
break;
}
}
// 자식이 2명일 경우
else
{
if (heap[i] > heap[i * 2] && heap[i] > heap[i * 2 + 1])
{
break;
}
else if (heap[i * 2] >= heap[i * 2 + 1])
{
swap(i, i * 2);
i = i * 2;
}
else if (heap[i * 2] < heap[i * 2 + 1])
{
swap(i, i * 2 + 1);
i = i * 2 + 1;
}
else
{
break;
}
}
}
return top;
}
int main(void)
{
int N;
scanf("%d", &N);
int x;
for (int i = 0; i < N; i++)
{
scanf("%d", &x);
if (x == 0)
{
if (hn == 0)
{
printf("%d\n", 0);
}
else
{
printf("%d\n", pop());
}
}
else
{
push(x);
}
}
return 0;
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
'백준(C언어) > 23년 8월' 카테고리의 다른 글
[C] 백준 - 1068번: 트리 (0) | 2023.08.31 |
---|---|
[C] 백준 - 1449번: 수리공 항승 (0) | 2023.08.30 |
[C] 백준 - 2565번: 전깃줄 (0) | 2023.08.28 |
[C] 백준 - 2583번: 영역 구하기 (0) | 2023.08.25 |
[C] 백준 - 5639번: 이진 검색 트리 (0) | 2023.08.24 |
댓글