컴공댕이 공부일지
[ C++/cpp ] 백준 (11268 절댓값 힙) ⭐자료구조, 우선순위 큐 본문
728x90
백준 11268번 절댓값 힙
( 실버 1 )
https://www.acmicpc.net/problem/11286
11286번: 절댓값 힙
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
(정답 코드)
#include <iostream>
#include <queue>
using namespace std;
struct cmp {
bool operator() (const int& x1, const int& x2) {
if(abs(x1) != abs(x2)) {
//절댓값 다른경우 절댓값이 작은 수에 우선순위 부여
return abs(x1) > abs(x2);
}
// 절댓값 같으면 작은 수에 우선순위 부여
return x1 > x2;
}
};
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
int n , x ;
priority_queue <int, vector<int>, cmp> pq; //절댓값 힙 구현할 우선순위 큐
cin >> n;
while(n--) {
cin >> x;
if(x) {
pq.push(x);
}
else {
//pq가 비어있는 경우 0 출력
if (pq.empty()) {
cout << "0\n";
}
else {
cout << pq.top() << "\n";
pq.pop();
}
}
}
return 0;
}
📖 풀이 요약
이 문제는 우선순위 큐를 다루는 문제이다 !
우선순위 큐와 힙 자료구조에 대해 더 알고싶다면, 아래 링크로 :)
[ 우선순위 큐와 힙 ] 완전 이진 트리, heap의 구현 ( + 백준 11279번 최대힙)
🔎 우선순위 큐란? 기존의 큐는 먼저 넣은 요소가 먼저 나오는 FIFO( first in - first out )이지만, 우선순위 큐는 들어간 순서 상관없이, 우선순위가 높은 데이터가 먼저 나온다 ! (ex.위급한 사람부터
somde.tistory.com
🚨 항상 우선순위 큐 문제에서 힙을 쓸 때, 유의할 점 !!
" 비어있는 큐의 top을 접근하진 않았는지 !! " 체크 해야한다.
위의 문제는 힙 자료구조를 기반으로, 원하는 힙의 조건에 따라 구조체를 구현해 풀 수 있다 !
// 마치 sort 비교함수처럼, 구조체를 선언해서 원하는 힙의 조건을 명시할 수 있다 ! :)
// 절댓값을 비교하여 최대 힙으로 만드는 비교자 구조체
struct CompareAbs {
bool operator()(int a, int b) const {
return abs(a) > abs(b);
}
};
// 최대힙
priority_queue<int> maxHeap;
// 최소힙
priority_queue<int, vector<int>, greater<int>> minHeap;
// 절댓값 힙
priority_queue<int, vector<int>, CompareAbs> absHeap;
728x90
'문제 풀이 > 코딩 문제 풀이 모음' 카테고리의 다른 글
[ C++/cpp ] 백준 (1018 체스판 다시 칠하기) ⭐브루트포스 알고리즘 (1) | 2024.03.29 |
---|---|
[ C++/cpp ] 백준 (2839 설탕 배달) ⭐그리디 알고리즘 (1) | 2024.03.28 |
[ C++/cpp ] 백준 (2840 행운의 바퀴) ⭐구현, 시뮬레이션 💥💦 (4) | 2024.03.05 |
[ C++/cpp ] 백준 (10814 나이순 정렬) ⭐sort_stable (0) | 2024.03.02 |
[ C++/cpp ] 백준 (11650 좌표 정렬하기) ⭐정렬, 비교함수 (0) | 2024.02.29 |