μƒˆμ†Œμ‹

μ•Œκ³ λ¦¬μ¦˜/BaekJoon

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

  • -
728x90

문제

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

예λ₯Ό λ“€μ–΄ 백쀀이가 λ™μƒμ—κ²Œ 1, 5, 2, 10, -99, 7, 5λ₯Ό μˆœμ„œλŒ€λ‘œ μ™Έμ³€λ‹€κ³  ν•˜λ©΄, 동생은 1, 1, 2, 2, 2, 2, 5λ₯Ό μ°¨λ‘€λŒ€λ‘œ 말해야 ν•œλ‹€. 백쀀이가 μ™ΈμΉ˜λŠ” μˆ˜κ°€ μ£Όμ–΄μ‘Œμ„ λ•Œ, 동생이 말해야 ν•˜λŠ” 수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

 

μž…λ ₯ 1

7
1
5
2
10
-99
7
5

좜λ ₯ 1

1
1
2
2
2
2
5

 

μ½”λ“œ

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

using namespace std;

//1655번 κ°€μš΄λ°λ₯Ό λ§ν•΄μš”
//μ΅œμ†Œνž™, μ΅œλŒ€νž™ μ‚¬μš©
int main() {
    
    cin.tie(NULL);
    cout.tie(NULL);

    int N,temp;
    priority_queue<int> max;        //μ΅œλŒ€νž™       μš°μ„ μˆœμœ„ νλŠ” default둜 less<in>λ₯Ό μ‚¬μš©
    priority_queue<int,vector<int>,greater<int>> min;       //μ΅œμ†Œνž™
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> temp;

        (max.size() == min.size()) ? max.push(temp) : min.push(temp);

        if (!max.empty() && !min.empty()&& max.top() > min.top()) {
            //쀑간 κ°’μ˜ μˆœμ„œκ°€ 달라진닀면 κ°’ λ°”κΎΈκΈ°
            int maxVal, minVal;
            maxVal = max.top();
            minVal = min.top();
            max.pop();
            min.pop();
            max.push(minVal);
            min.push(maxVal);
        }

        cout << max.top()<<"\n";
    }
    
    return 0;
}

 

*κ°„λ‹¨ν•œ ν•΄μ„€*

μ—¬λŸ¬κ°€μ§€ μ•Œκ³ λ¦¬μ¦˜ μ€‘μ—μ„œ 무엇을 μ™œ μ“°λŠ”μ§€κ°€ 핡심인데 μ—¬κΈ°μ„œλŠ” μ΅œμ†Œνž™, μ΅œλŒ€νž™μ„ μ‚¬μš©ν•œλ‹€.

κ·Έ μ΄μœ λŠ” νž™μ€ μ—¬λŸ¬κ°œμ˜ κ°’ 쀑 μ΅œλŒ“κ°’ λ˜λŠ” μ΅œμ†Ÿκ°’μ„ μ°Ύμ•„λ‚΄λŠ” 연산이 λΉ λ₯΄κΈ° λ•Œλ¬Έμ— μ—¬κΈ°μ„œ μ‚¬μš©ν•˜λ©΄ λΉ λ₯Έ 연산이 κ°€λŠ₯ν•˜λ‹€.

νž™μ€ 일반적으둜 μ™„μ „ μ΄μ§„νŠΈλ¦¬μ΄λ―€λ‘œ 배열을 μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•œλ‹€.

μ΅œλŒ€ νž™μ€ 루트 λ…Έλ“œλ‘œ 올라갈수둝 μ €μž₯된 값이 μ»€μ§€λŠ” ꡬ쑰이닀. 

μ΅œμ†Œ νž™μ€ 루트 λ…Έλ“œλ‘œ 올라갈수둝 값이 μž‘μ•„μ§€λŠ” ꡬ쑰이닀.

 

이 문제의 경우 배열을 λ°˜ν‹ˆμœΌλ‘œ λ‚˜λˆ„μ–΄μ„œ ν•œμͺ½μ€ μ΅œμ†Œ νž™, ν•œμͺ½μ€ μ΅œλŒ€ νž™μ„ μ‚¬μš©ν•˜μ—¬ λΉ λ₯΄κ²Œ μ—°μ‚°ν•˜λŠ” λ¬Έμ œμ΄λ‹€. 이 경우 priority_queueλ₯Ό μ΄μš©ν•˜μ—¬ κ΅¬ν˜„ν•  수 μžˆλ‹€. priority_queueλŠ” νž™μ„ μ΄μš©ν•˜μ—¬ κ΅¬ν˜„λ˜μ–΄ 있고 μ˜΅μ…˜μ„ μ΄μš©ν•˜μ—¬ greater<int> 및 less<int>λ₯Ό μ΄μš©ν•˜μ—¬ μœ„μ™€κ°™μ€ μ΅œμ†Œνž™, μ΅œλŒ€νž™ ꡬ쑰λ₯Ό λ§Œλ“€ 수 μžˆλ‹€. λ”°λΌμ„œ 이λ₯Ό ν†΅ν•΄μ„œ 쀑간값을 μ°ΎλŠ” 것이라 λ°˜ν‹ˆμ„ λ‚˜λˆ„μ–΄μ„œ μ˜€λ¦„μ°¨μˆœ, λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬λ˜λŠ” μ΅œμ†Œνž™, μ΅œλŒ€νž™μ„ μ΄μš©ν•˜λ©΄ λΉ λ₯΄κ²Œ ν†΅κ³Όν•˜λŠ” μ½”λ“œλ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

 

 

 

*이 λ°©λ²•λ§Œμ΄ λ§žλŠ” 정닡은 μ•„λ‹™λ‹ˆλ‹€.

훨씬 μ’‹κ³  λΉ λ₯Έ λ‹€λ₯Έ μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ•Œκ³ λ¦¬μ¦˜ κ³΅λΆ€ν•˜μ‹œλŠ” λΆ„λ“€ ν™”μ΄νŒ…! '0'/*

λ°˜μ‘ν˜•
Contents

ν¬μŠ€νŒ… μ£Όμ†Œλ₯Ό λ³΅μ‚¬ν–ˆμŠ΅λ‹ˆλ‹€

이 글이 도움이 λ˜μ—ˆλ‹€λ©΄ 곡감 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€.