ν‹°μŠ€ν† λ¦¬ λ·°

μ΅œλŒ€νž™κ³Ό μ΅œμ†Œνž™μ„ μ΄μš©ν•˜λ©΄ μ‰½κ²Œ ν’€ 수 μžˆλŠ” λ¬Έμ œμ˜€λ‹Ή..

 

값이 λ“€μ–΄μ˜¬ λ•Œλ§ˆλ‹€ 쀑간값을 좜λ ₯ν•˜κ²Œ 되면 μ‹œκ°„ λ³΅μž‘λ„κ°€ μ¦κ°€ν•˜κ³  이 λ¬Έμ œλŠ” μ‹œκ°„ μ œν•œμ΄ 있기 λ•Œλ¬Έμ—... λ‹€λ₯Έ 방법이 ν•„μš”ν–ˆλ‹€

 

μ—¬κΈ°μ„œ 쑰건은 

1. μ΅œμ†Œ νž™μ˜ 값듀은 λͺ¨λ‘ μ΅œλŒ€ νž™λ³΄λ‹€ 큼

2. μ΅œλŒ€ νž™μ˜ 크기가 μ΅œμ†Œ νž™μ˜ 크기보닀 1 ν¬κ±°λ‚˜ 같도둝 μœ μ§€ν•˜λ©΄μ„œ 값을 λ„£μ–΄μ•Ό 함

3. 값을 λ„£μ–΄μ€€ 후에 μ΅œλŒ€ νž™κ³Ό μ΅œμ†Œ νž™μ˜ top 값을 비ꡐ해 μ΅œμ†Œ νž™μ˜ top보닀 μ΅œλŒ€ νž™μ˜ top이 더 크닀면 swap함

 

arr[] = { 1, 5, 2, 10, -99, 7, 5 } ← 배열이 이렇닀면

 

[1 μ‚½μž…]

- maxH = 1

- minH

→ 좜λ ₯ : 1

 

[5 μ‚½μž…]

- maxH = 1

- minH = 5

→ 좜λ ₯ : 1

 

[2 μ‚½μž…]

- maxH = 1 2

- minH = 5

→ 좜λ ₯ : 2

 

[10 μ‚½μž…]

- maxH = 1 2

- minH = 5 10

→ 좜λ ₯ : 2

 

[-99 μ‚½μž…]

- maxH -99 1 2

- minH = 5 10

→ 좜λ ₯ : 2

 

[7 μ‚½μž…]

- maxH = -99 1 2

- minH = 5 7 10

→ 좜λ ₯ : 2

 

[5 μ‚½μž…]

- maxH = -99 1 2 5

- minH = 5 7 10

→ 좜λ ₯ : 5

 

λ§Œμ•½ 맨 λ§ˆμ§€λ§‰μ— 5κ°€ μ•„λ‹ˆλΌ 6이 μ‚½μž…λ˜μ—ˆλ‹€λ©΄?

- maxH = -99 1 2 6

- minH = 5 7 10

μ΄λ ‡κ²Œ λ˜μ§€λ§Œ maxH의 top이 minH의 top보닀 크게 λ˜λ―€λ‘œ swapν•΄μ„œ

- minH = -99 1 2 5

- minH = 6 7 10

→ 좜λ ₯ : 5

 

μ—¬κΈ°μ„œ μ΅œλŒ€νž™κ³Ό μ΅œμ†Œνž™μ„ κ΅¬ν˜„ν•˜κΈ° μœ„ν•΄ priority_queue container을 μ΄μš©ν•  수 있음

- μš°μ„ μˆœμœ„ 큐 κ΅¬ν˜„(vector, deque container와 λΆ™μ—¬μ„œ μ‚¬μš© κ°€λŠ₯)

- <queue 헀더 파일>

 

ν˜•μ‹

priority_queue<Data Type> λ³€μˆ˜ 이름

- κΈ°λ³Έ μƒμ„±μž ν˜•μ‹

bool empty() const; 

- λΉ„μ–΄μžˆμœΌλ©΄ 0 λ°˜ν™˜

size_type size() const;

- μ›μ†Œ 개수

const value_type & top() const;

- 맨 μœ„ μ›μ†Œ λ°˜ν™˜(top λ°˜ν™˜)

void push(const value_type & val);

- push κΈ°λŠ₯

void pop(); 

- pop κΈ°λŠ₯

 

[μ „μ²΄μ½”λ“œ]

// BOJ 1655 κ°€μš΄λ°λ₯Ό λ§ν•΄μš”
#include <iostream>
#include <queue>
using namespace std;

int main() {
    ios_base::sync_with_stdio(false); // μž…μΆœλ ₯ λΉ λ₯΄κ²Œ 처리
    cin.tie(NULL);
    cout.tie(NULL);

    priority_queue<int> maxH; // μ΅œλŒ€ νž™
    priority_queue<int, vector<int>, greater<int> > minH; // μ΅œμ†Œ νž™
    int n, elem; // n : 숫자 개수 / elem : μž…λ ₯ν•˜λŠ” 수
    cin >> n; // n λ¨Όμ € μž…λ ₯λ°›μŒ

    for(int i = 0; i < n; i++){
        cin >> elem; // 숫자λ₯Ό ν•˜λ‚˜μ”© μž…λ ₯λ°›μŒ
        if(maxH.size() == minH.size()) // μ΅œλŒ€νž™κ³Ό μ΅œμ†Œνž™μ˜ 크기 같을 λ•Œ
            maxH.push(elem); // μ΅œλŒ€ νž™μ— push
        else // μ΅œλŒ€ νž™μ΄ 더 클 λ•Œ
            minH.push(elem); // μ΅œμ†Œ νž™μ— push

        if(!minH.empty() && !maxH.empty()){ // λ‘˜ λ‹€ λΉ„μ–΄μžˆμ§€ μ•Šκ³ 
            if(maxH.top() > minH.top()){ // μ΅œλŒ€ νž™μ˜ top이 더 클 λ•Œ
                int temp_max = maxH.top(); // 각자의 값을 swap 
                int temp_min = minH.top(); 
                maxH.pop();
                minH.pop();
                maxH.push(temp_min);
                minH.push(temp_max);
            }
        }
        cout << maxH.top() << "\n"; // μ΅œλŒ€ νž™μ˜ top을 맀번 좜λ ₯ (쀑간값)
    }
}

 

λ‚˜λŠ” 이 문제λ₯Ό ν’€λ©΄μ„œ μ‹œκ°„μ΄ˆκ³Όκ°€ 계속 λ‚˜μ„œ 이유λ₯Ό κ³ λ―Όν–ˆλŠ”λ°

결정적인 μ΄μœ λŠ”

cout << maxH.top() << endl;

λ°”λ‘œ 이것 λ•Œλ¬Έμ΄μ—ˆλ‹€

μ€„λ°”κΏˆ λ•Œλ¬Έμ— endl을 μΌμ—ˆλŠ”λ° 그것보닀 "\n"을 μ“°λŠ”κ²Œ 더 μ‹€ν–‰ 속도가 λΉ λ₯΄λ‹€.... λͺ°λžμŒ

 

그리고

ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);

이 μ½”λ“œλ₯Ό μ“°λ©΄ μž…μΆœλ ₯을 λ”μš± 빨리 μ²˜λ¦¬ν•  수 μžˆλ‹€κ³  ν•˜λ‹ˆ μ•Œμ•„λ‘μ–΄μ•Όκ² λ‹€!! 

 

μ‹€ν–‰κ²°κ³Ό

Comments