컴퓨터 사이언스/1고리즘

백준 2696 : 중앙값 구하기

저세상 개발자 2021. 7. 3. 20:07

https://www.acmicpc.net/problem/2696

 

2696번: 중앙값 구하기

첫째 줄에 테스트 케이스의 개수 T(1 ≤ T ≤ 1,000)가 주어진다. 각 테스트 케이스의 첫째 줄에는 수열의 크기 M(1 ≤ M ≤ 9999, M은 홀수)이 주어지고, 그 다음 줄부터 이 수열의 원소가 차례대로 주

www.acmicpc.net

어떤 배열이 주어졌을 때 중앙값을 찾는 문제이다. 직전에 포스팅했던 K번째 수 찾기와 동일한 로직으로 풀 수 있다.

K번 째 수 찾기 - https://unfunhy.tistory.com/43

 

[python] K번 째 수 찾기

import heapq def findKth(myInput, k) : ''' 매 순간마다 k번째로 작은 원소를 리스트로 반환합니다. ''' result = [] l = [] #max_heap r = [] #min_heap for i in myInput: # max_heap이 비어있거나, max_heap..

unfunhy.tistory.com

#include <iostream>
#include <queue>
#include <vector>

#define fastio ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
using namespace std;

int main() {
	fastio;

	int t, m, n;
	cin >> t;
	while (t--) {
		cin >> m;

		priority_queue<int> l; // max_heap
		priority_queue<int> r; // min_heap
		vector<int> ans;

		for (int i = 1; i <= m; i++) {
			cin >> n;
			if (l.empty() || l.top() >= n) l.emplace(n);
			else r.emplace(-n);

			if (l.size() > r.size() + 1) {
				r.emplace(-l.top());
				l.pop();
			}
			else if (l.size() < r.size()) {
				l.emplace(-r.top());
				r.pop();
			}

			if (i & 1) ans.push_back(l.top());
		}
		cout << ans.size() << '\n';
		for(int i : ans) cout << i << ' ';
		cout << '\n';
	}
	return 0;
}

위는 c++ 구현 코드이다. 파이썬에서 heapq는 min heap인 반면 c++에서 pq는 max heap임을 참고바란다.

메모리: 2156 kb 시간: 0 ms