λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μ•Œκ³ λ¦¬μ¦˜ 문제 풀이

[λ°±μ€€] 1655번: κ°€μš΄λ°λ₯Ό λ§ν•΄μš”

by syLim___ 2023. 2. 8.
728x90

 

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

 

1655번: κ°€μš΄λ°λ₯Ό λ§ν•΄μš”

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

www.acmicpc.net


μ²˜μŒμ—λŠ” λ‹¨μˆœν•˜κ²Œ μƒκ°ν•΄μ„œ μž…λ ₯받은 값듀을 맀번 μ •λ ¬ν•˜μ—¬ 쀑간값을 좜λ ₯ν–ˆμ—ˆλŠ”λ°, κ·Έλ ‡κ²Œ ν•˜λ‹ˆκΉŒ μ‹œκ°„μ΄ˆκ³Όκ°€ 났닀

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int main(){
	
	int n; cin >> n;
	
	vector<int> v;
	for(int i=0;i<n;i++){
		int k; cin >> k;
		v.push_back(k);
		sort(v.begin(), v.end());
		
		if(i<=1) cout<<v[0];
		else cout<<v[i/2];
	}
	return 0;
}

μ‹œκ°„μ΄ˆκ³Όκ°€ λ‚˜μ§€ μ•ŠμœΌλ €λ©΄ μš°μ„ μˆœμœ„νλ₯Ό μ΄μš©ν•΄μ•Ό ν–ˆλ‹€

 

μš°μ„ μˆœμœ„ν(Priority Queue)

  •  μž„μ˜μ˜ μˆœμ„œλ‘œ μž…λ ₯된 μš°μ„ μˆœμœ„κ°€ μžˆλŠ” μ›μ†Œλ“€μ„ μ €μž₯ν•˜κ³ , μš°μ„ μˆœμœ„μ— 따라 좜λ ₯ν•˜λŠ” 자료ꡬ쑰
  •  key에 따라 λ‚΄λΆ€ μ›μ†Œλ“€ κ°„μ˜ μš°μ„ μˆœμœ„λ₯Ό λΆ€μ—¬ν•œλ‹€

 


 

이 문제λ₯Ό ν’€κΈ° μœ„ν•΄μ„œλŠ” μ΅œμ†Œνž™, μ΅œλŒ€νž™μ„ λ§Œλ“€κ³ , μ•„λž˜ κ·œμΉ™μ— 따라 μ›μ†Œλ₯Ό μ •λ ¬ν•˜λ©΄ λœλ‹€.

 

  1. μ΅œμ†Œνž™μ˜ ν¬κΈ°λŠ” μ΅œλŒ€νž™μ˜ 크기보닀 컀질 수 μ—†λ‹€
  2. μ΅œλŒ€νž™μ˜ ν¬κΈ°λŠ” μ΅œμ†Œνž™μ˜ 크기보닀 μ΅œλŒ€ 1만큼 더 크닀
  3. μ΅œμ†Œνž™μ˜ 값듀은 μ΅œλŒ€νž™λ³΄λ‹€ 크닀. 
  4. μ›μ†Œ μ‚½μž… ν›„, μ΅œλŒ€νž™μ˜ top이 μ΅œμ†Œνž™μ˜ top보닀 크닀면 두 값을 swapν•΄μ€€λ‹€

 

μ΄λ ‡κ²Œ 되면 μ΅œλŒ€νž™μ˜ top이 항상 쀑간값이 λœλ‹€.

 


 

λ¬Έμ œμ— λ‚˜μ˜¨ ν…ŒμŠ€νŠΈμΌ€μ΄μŠ€λ‘œ 예λ₯Ό λ“€μ–΄ 보자!!

μž…λ ₯κ°’: 1, 5, 2, 10, -99, 7, 6

 

1

μ΅œλŒ€νž™ 크기가 μ΅œμ†Œνž™ 크기보닀 μ»€μ•Όν•˜λ―€λ‘œ, μ΅œλŒ€νž™μ— μ‚½μž…ν•œλ‹€

μ΅œλŒ€νž™ [1]  μ΅œμ†Œνž™ [ ]  쀑간값  1

 

5

μ΅œλŒ€νž™μ— μ‚½μž…ν•˜λ©΄ μ΅œλŒ€νž™ 크기가 μ΅œμ†Œνž™ 크기보닀 2만큼 μ»€μ§€λ―€λ‘œ μ΅œλŒ€νž™μ— μ‚½μž… λΆˆκ°€λŠ₯

μ΅œμ†Œνž™μ— μ‚½μž…ν•œλ‹€

μ΅œλŒ€νž™[1]   μ΅œμ†Œνž™[5]   μ€‘κ°„κ°’ 1

 

2

μ΅œλŒ€νž™ 크기가 μ΅œμ†Œνž™ 크기보닀 μ»€μ•Όν•˜λ―€λ‘œ, μ΅œλŒ€νž™μ— μ‚½μž…ν•œλ‹€

μ΅œλŒ€νž™[2,1]   μ΅œμ†Œνž™[5]   μ€‘κ°„κ°’ 2

 

10

μ΅œλŒ€νž™μ— μ‚½μž…ν•˜λ©΄ μ΅œλŒ€νž™ 크기가 μ΅œμ†Œνž™ 크기보닀 2만큼 μ»€μ§€λ―€λ‘œ μ΅œλŒ€νž™μ— μ‚½μž… λΆˆκ°€λŠ₯

μ΅œμ†Œνž™μ— μ‚½μž…ν•œλ‹€

μ΅œλŒ€νž™[2,1]   μ΅œμ†Œνž™[5,10]   μ€‘κ°„κ°’ 2

 

-99

μ΅œλŒ€νž™ 크기가 μ΅œμ†Œνž™ 크기보닀 μ»€μ•Όν•˜λ―€λ‘œ, μ΅œλŒ€νž™μ— μ‚½μž…ν•œλ‹€

μ΅œλŒ€νž™[2,1,-99]   μ΅œμ†Œνž™[5,10]   μ€‘κ°„κ°’ 2

 

7

μ΅œλŒ€νž™μ— μ‚½μž…ν•˜λ©΄ μ΅œλŒ€νž™ 크기가 μ΅œμ†Œνž™ 크기보닀 2만큼 μ»€μ§€λ―€λ‘œ μ΅œλŒ€νž™μ— μ‚½μž… λΆˆκ°€λŠ₯

μ΅œμ†Œνž™μ— μ‚½μž…ν•œλ‹€

μ΅œλŒ€νž™[2,1,-99]   μ΅œμ†Œνž™[5,7,10]   μ€‘κ°„κ°’ 2

 

6

μ΅œλŒ€νž™ 크기가 μ΅œμ†Œνž™ 크기보닀 μ»€μ•Όν•˜λ―€λ‘œ, μ΅œλŒ€νž™μ— μ‚½μž…ν•œλ‹€

μ΅œλŒ€νž™[6,2,1,-99]   μ΅œμ†Œνž™[5,7,10] 

μ΅œλŒ€νž™μ˜ top이 μ΅œμ†Œνž™μ˜ top보닀 ν¬λ―€λ‘œ 두 값을 λ°”κΎΈμ–΄μ€€λ‹€!!

μ΅œλŒ€νž™[5,2,1,-99]   μ΅œμ†Œνž™[6,7,10]   μ€‘κ°„κ°’ 5


μ½”λ“œ

#include <iostream>
#include <queue>
#include <functional>

using namespace std;

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(0);
    
	priority_queue<int> max_heap;
	priority_queue<int, vector<int>, greater<int>> min_heap;
	
	int n; cin>>n;
	
	int k;
	for(int i=0;i<n;i++){
		cin >> k;
		 
        //μ›μ†Œ μ‚½μž…
		if(max_heap.size() == min_heap.size()) max_heap.push(k); 
		else min_heap.push(k);
		
        //μ΅œλŒ€νž™μ˜ top이 μ΅œμ†Œνž™μ˜ top보닀 크면 두 값을 λ°”κΏ”μ£ΌκΈ°
		if(!min_heap.empty() && max_heap.top() > min_heap.top()) {
			int maxtop = max_heap.top();
			int mintop = min_heap.top();
			max_heap.pop(); max_heap.push(mintop);
			min_heap.pop(); min_heap.push(maxtop);	
		}
	
    	//μ΅œλŒ€νž™μ˜ top을 좜λ ₯
		cout<<max_heap.top()<<"\n";
		
	}
	
	return 0;
}
728x90