Baekjoon 11286 (절댓값 힙)

Baekjoon 11286 (절댓값 힙)

Baekjoon 11286, 백준 11286 문제의 본인 풀이입니다!
문제는 아래의 링크에서 확인할 수 있습니다.
문제보기

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
#include <cstdio>
#include <queue>

using namespace std;

int main() {

// use priority_queue
priority_queue<pair<int, int>> pq;

// first: -abs(number), second: 1 or -1 => original number: first * second
// why? default is greater<int> : big values come first
int N, num;
scanf("%d", &N);

for(int i = 0; i < N; i++) {
scanf("%d", &num);
if(num == 0) {
if(pq.empty()) {
printf("0\n");
} else {
// queue is not empty
printf("%d\n", pq.top().first * pq.top().second);
pq.pop();
}
} else {
if(num < 0) pq.push({num, 1});
else pq.push({-num, -1});
}
}
}

직접 배열로 절댓값 힙을 구현한 결과, 시간 초과와 마주하였다.
(너무 많은 if문이 그 요인이라고 판단된다)

따라서, 우선순위 큐 (priority_queue) 를 사용하여 문제를 해결하였다.
큐에 pair<int, int>를 넣어 하나를 절댓값, 하나를 부호로 사용하였다!

실제 값을 출력해 주어야 하기 때문에, 그 정보를 잃어서는 안된다.
본 경우에선 두 int 값을 곱하면 (first * second) 실제 값을 얻을 수 있었다.

Author

Yeonsang Shin

Posted on

2020-08-25

Updated on

2022-12-19

Licensed under

Comments