πŸ•οΈ PS (BOJ)/Linear Data Structure

[BOJ][C++] λ°±μ€€ 1655번: κ°€μš΄λ°λ₯Ό λ§ν•΄μš” (Gold II)

선달 2025. 4. 30. 01:16
λ°˜μ‘ν˜•

문제

λ°±μ€€μ΄λŠ” λ™μƒμ—κ²Œ "κ°€μš΄λ°λ₯Ό λ§ν•΄μš”" κ²Œμž„μ„ κ°€λ₯΄μ³μ£Όκ³  μžˆλ‹€. 백쀀이가 μ •μˆ˜λ₯Ό ν•˜λ‚˜μ”© μ™ΈμΉ λ•Œλ§ˆλ‹€ 동생은 μ§€κΈˆκΉŒμ§€ 백쀀이가 λ§ν•œ 수 μ€‘μ—μ„œ 쀑간값을 말해야 ν•œλ‹€. λ§Œμ•½, κ·Έλ™μ•ˆ 백쀀이가 μ™ΈμΉœ 수의 κ°œμˆ˜κ°€ 짝수개라면 쀑간에 μžˆλŠ” 두 수 μ€‘μ—μ„œ μž‘μ€ 수λ₯Ό 말해야 ν•œλ‹€.
예λ₯Ό λ“€μ–΄ 백쀀이가 λ™μƒμ—κ²Œ 1, 5, 2, 10, -99, 7, 5λ₯Ό μˆœμ„œλŒ€λ‘œ μ™Έμ³€λ‹€κ³  ν•˜λ©΄, 동생은 1, 1, 2, 2, 2, 2, 5λ₯Ό μ°¨λ‘€λŒ€λ‘œ 말해야 ν•œλ‹€. 백쀀이가 μ™ΈμΉ˜λŠ” μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 동생이 말해야 ν•˜λŠ” 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

μž…λ ₯

첫째 μ€„μ—λŠ” 백쀀이가 μ™ΈμΉ˜λŠ” μ •μˆ˜μ˜ 개수 N이 μ£Όμ–΄μ§„λ‹€. N은 1보닀 ν¬κ±°λ‚˜ κ°™κ³ , 100,000보닀 μž‘κ±°λ‚˜ 같은 μžμ—°μˆ˜μ΄λ‹€. κ·Έ λ‹€μŒ N쀄에 κ±Έμ³μ„œ 백쀀이가 μ™ΈμΉ˜λŠ” μ •μˆ˜κ°€ μ°¨λ‘€λŒ€λ‘œ μ£Όμ–΄μ§„λ‹€. μ •μˆ˜λŠ” -10,000보닀 ν¬κ±°λ‚˜ κ°™κ³ , 10,000보닀 μž‘κ±°λ‚˜ κ°™λ‹€.

좜λ ₯

ν•œ 쀄에 ν•˜λ‚˜μ”© N쀄에 걸쳐 λ°±μ€€μ΄μ˜ 동생이 말해야 ν•˜λŠ” 수λ₯Ό μˆœμ„œλŒ€λ‘œ 좜λ ₯ν•œλ‹€.

 

풀이

이쀑 νž™μ„ μ‚¬μš©ν•΄μ•Όν•˜λŠ” 문제

// 풀이 : https://whkakrkr.tistory.com

#include <bits/stdc++.h>

using namespace std;

int main() {
    ios_base::sync_with_stdio(false);
	cout.tie(NULL);
	cin.tie(NULL);
	
	int n;
	cin >> n;
	
	priority_queue<int> left;
	priority_queue<int, vector<int>, greater<>> right;
	
	int a;
	for(int i=1; i<=n; i++) {
	    cin >> a;
	    
	    if(left.empty() || left.top()>a) {
	        left.push(a);
	    } else {
	        right.push(a);
	    }
	    
	    int mid = (i+1)/2;
	    if(left.size() < mid) {
	        left.push(right.top());
	        right.pop();
	    } else if(left.size() > mid) {
	        right.push(left.top());
	        left.pop();
	    }
	    
	    cout << left.top() << "\n";
	}
	
    return 0;
}
λ°˜μ‘ν˜•