참고한 글
[1655번] 가운데를 말해요
문제 출처 : https://www.acmicpc.net/problem/1655 알고리즘 분석 : 문제 해결에 필요한 사항 1. 최대 힙, 최소 힙 2. Priority Queue 3. pq로 중간 값 구하는 방식 중간값 구하기 알고리즘은 다음과 같다. 1. 최..
www.crocus.co.kr
중요 지식
priority_queue - C++ STL로 우선순위 큐를 간단히 사용할 수 있다.
코드
#include <iostream>
#include <queue>
using namespace std;
int main(){
int N;
priority_queue<int> maxQ;
priority_queue<int, vector<int>, greater<int>> minQ;
cin >> N;
while(N--){
int num;
scanf("%d", &num);
// 조건 1
if(maxQ.empty() || maxQ.size() == minQ.size())
maxQ.push(num);
else
minQ.push(num);
// 조건 2
if((!maxQ.empty() && !minQ.empty()) && maxQ.top() > minQ.top()){
int a = maxQ.top();
int b = minQ.top();
maxQ.pop();
minQ.pop();
maxQ.push(b);
minQ.push(a);
}
printf("%d\n", maxQ.top());
}
return 0;
}
풀이
사전지식
두 개의 우선순위 큐(maxQ, minQ)를 만들고 다음 조건을 건다
조건 1. maxQ의 크기는 minQ의 크기와 같거나, 하나 더 크다.
조건 2. maxQ의 최대 원소는 minQ의 최소 원소보다 작거나 같다.
이때 조건 2가 맞지 않다면 maxQ, 최소 힙의 가장 위의 값을 swap해준다.
위 두가지 규칙을 유지해 준다면 항상 maxQ의 top값이 중간값이 된다.
알고리즘
1-1. 처음 시작할 때 maxQ에 먼저 정수를 push한다 (이유는 maxQ의 top값이 중간값이므로 계속 출력하기 위함)
1-2. maxQ와 minQ의 크기가 같다면, maxQ, 크기가 다르다면 minQ에 push한다.
2. maxQ와 minQ가 비어있지 않고, maxQ.top()값이 minQ.top()값보다 크다면 두 원소를 swap한다
3. 중간값인 maxQ.top()를 출력한다
Q&A
1. Q : maxQ와 minQ에 값을 번갈아가며 push하는 이유
A : maxQ와 minQ의 의미는 중간을 기준으로 한 왼쪽(작은 값)과 오른쪽(큰 값)이고 top()값의 의미는 중간에 있는 값이란 뜻이다 그래서 왼쪽(작은 값)과 오른쪽(큰 값)의 길이가 같거나 1의 차이가 나야 중간값을 추출할 수 있기 때문에 번갈아가며 넣는 것이다.
2. Q : maxQ.top()값이 minQ.top()값보다 크다면 두 원소를 swap하는 이유
A : 일단 maxQ는 왼쪽(작은 값)중 최대값(top)을 추출하고, minQ는 오른쪽(큰 값)중 최소값(top)을 추출한다
만약 maxQ(작은 값)이 minQ(큰 값)보다 크면 안되므로 새롭게 값이 들어올때마다 검사하는 것이다
3. Q : 중간값이 maxQ.top()인 이유
A : maxQ와 minQ의 길이가 같거나 1의 차이가 나야 중간값을 구할 수 있다 현재 조건에선 maxQ의 길이가 minQ의 길이보다 1만큼 더 클 수 있기 때문에 길이가 더 긴 maxQ의 top()값이 중간값이다
새롭게 알게된 지식
priority_queue
개념 : c++의 STL인 우선순위 큐이다
기능 : 우선순위 큐답게 최소 또는 최대 요소를 빠르게 구할 수 있다
최대 우선순위 : priority_queue<int, vector<int>, less<int>> (default)
최소 우선순위 : priority_queue<int, vector<int>, greater<int>>
자세한 사항은 아래 참고
https://jungeu1509.github.io/algorithm/use-priorityqueue/
C++ STL priority_queue 우선순위 큐 사용법
C++ stl을 사용한 우선순위 큐 내용정리.
jungeu1509.github.io
'프로그래밍 문제집 > 백준' 카테고리의 다른 글
3197번-백조의 호수 (어려움) (0) | 2022.03.31 |
---|---|
[KOI 2021 1차대회 중등부] 21758번-꿀 따기 (0) | 2022.03.08 |
9663번-N-Queen (0) | 2022.02.28 |
15649번-N과 M (1) (0) | 2022.02.27 |
[KOI 2020 1차대회 중등부] 19942번-다이어트 (0) | 2022.02.27 |