Algorithm/C++ - BOJ
BOJ/백준 - 1665 가운데를 말해요 C++
ㅇㅇ잉
2021. 3. 24. 17:25
가운데를 말해보자!!!!!!
1655번: 가운데를 말해요
첫째 줄에는 수빈이가 외치는 정수의 개수 N이 주어진다. N은 1보다 크거나 같고, 100,000보다 작거나 같은 자연수이다. 그 다음 N줄에 걸쳐서 수빈이가 외치는 정수가 차례대로 주어진다. 정수는 -1
www.acmicpc.net
이거는..이거는 진짜 헷갈렸다
최대힙과 최소힙을 사용해서 문제를 풀어보자.
최대힙 : 값이 클 수록 우선순위 큼
최소힙 : 값이 작을 수록 우선순위 큼
*maxHeap의 top값은 중간값과 작거나 같아야 함
이렇게 만들거고, 이 개념을 토대로 중간값을 구하면 된다.
그래서 입력된 수열들의 중간값을 기준으로 각각 maxHeap, minHeap에 넣을것이다.
다음과 같은 조건 만족해야 함
1. maxHeap의 size는 minHeap의 size보다 1만큼 크거나 같다.
2. maxHeap의 top은 minHeap의 top보다 작거나 같아야 한다.
풀이
(1)
홀수개가 입력되면 maxHeap의 size가 1 더 클 것이다.
짝수개가 입력되면 maxHeap의 size와 minHeap의 size가 같을 것이다.
=maxHeap의 size는 minHeap의 size보다 1만큼 크거나 같다.
(2)
maxHeap의 top은 minHeap의 top보다 작거나 같아야 한다.
만약 maxHeap의 top이 minHeap의 top보다 크다면 swap해준다.
(3)
중간값 출력
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
32
33
34
35
36
37
38
39
|
#include <iostream>
#include <queue>
using namespace std;
int main() {
cin.tie(NULL);
ios_base::sync_with_stdio(false);
int n;
cin >> n;
priority_queue<int> maxHeap, minHeap;
for (int i = 0; i < n; i++) {
int tmp;
cin >> tmp;
//(1)
if (maxHeap.size() > minHeap.size()) minHeap.push(-tmp);
else maxHeap.push(tmp);
//(2)
if (!maxHeap.empty() && !minHeap.empty()) {
if (-minHeap.top() < maxHeap.top()) {
int max_val = maxHeap.top();
int min_val = -minHeap.top();
maxHeap.pop(); minHeap.pop();
maxHeap.push(min_val);
minHeap.push(-max_val);
}
}
//(3)
cout << maxHeap.top() << '\n';
}
return 0;
}
|
cs |