더보기
문제
https://www.acmicpc.net/problem/11286
11286번: 절댓값 힙
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0
www.acmicpc.net
소스코드
/******************************************************************************
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.
*******************************************************************************/
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <math.h>
using namespace std;
priority_queue<pair<int,int>,vector<pair<int,int>>,greater<pair<int,int>>> pq;
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
if(x==0){
if(pq.empty()){
cout<<0<<"\n";
}
else{
cout<<pq.top().second<<"\n";
pq.pop();
}
}
else{
pq.push({abs(x),x});
}
}
}
해설
이 문제는 오름차순으로 정렬하는걸 요구하는대신, 절댓값의 값에 따라 오름차순을 요구하고 있다.
그렇다면 우리는 절댓값을 기준으로 오름차순을 정렬한 후 원래의 숫자를 출력해주면 된다.
요구하는 사항이 기존의 출력값과 다른경우 한 쌍을 생각하여 비교한다고 생각하면 된다.
즉 pair<절댓값,기존입력값> 이런식으로 쌍을 이루어준다.
우선순위 큐의 오름차순과 내림차순을 정렬하는 문법은 greater,less이다. 이건 단순히 c++의 제공하는 문법적 프로퍼티를 잘 숙지해야 사용가능하다. greater를 사용하면 첫번째 숫자를 가지고 오름차순을 해주기 때문에 쌍을 이룰 때 첫번째 값에 절댓값을 넣어서 문제의 요구사항에 맞출 수 있다.
우선순위 큐는 우선순위가 필요로 한데 우선순위 대로 뽑아서 답을 도출해낼 때 용이하게 사용되도록 하니 우선순위 큐에 대해서 한번 정리를 해보겠다.
'Algorithm > 자료구조' 카테고리의 다른 글
[백준] 알고리즘 C++ 12015번 - 가장 긴 증가하는 부분 수열2 (0) | 2022.01.20 |
---|---|
[백준] 알고리즘 C++ 1300번 - K번째 수문제 (0) | 2022.01.19 |
[백준] 알고리즘 C++ 5430번 - AC문제 (0) | 2022.01.08 |
[백준] 알고리즘 C++ 17298번 - 오큰수 문제 (0) | 2022.01.07 |
[백준] 알고리즘 C++ 1927번 - 최소 힙문제 (0) | 2021.11.19 |