πŸ’»

[λ°±μ€€] μš°μ„ μˆœμœ„ 큐 - 1927. μ΅œμ†Œ νž™ λ³Έλ¬Έ

μ•Œκ³ λ¦¬μ¦˜/λ¬Έμ œν’€μ΄ Baekjoon

[λ°±μ€€] μš°μ„ μˆœμœ„ 큐 - 1927. μ΅œμ†Œ νž™

λ˜νš¨λ‹ˆ 2020. 2. 19. 18:01

문제

널리 잘 μ•Œλ €μ§„ 자료ꡬ쑰 쀑 μ΅œμ†Œ νž™μ΄λΌλŠ” 것이 μžˆλ‹€. μ΅œμ†Œ νž™μ„ μ΄μš©ν•˜μ—¬ λ‹€μŒκ³Ό 같은 연산을 μ§€μ›ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜μ‹œμ˜€.

  1. 배열에 μžμ—°μˆ˜ xλ₯Ό λ„£λŠ”λ‹€.
  2. λ°°μ—΄μ—μ„œ κ°€μž₯ μž‘μ€ 값을 좜λ ₯ν•˜κ³ , κ·Έ 값을 λ°°μ—΄μ—μ„œ μ œκ±°ν•œλ‹€.

ν”„λ‘œκ·Έλž¨μ€ μ²˜μŒμ— λΉ„μ–΄μžˆλŠ” λ°°μ—΄μ—μ„œ μ‹œμž‘ν•˜κ²Œ λœλ‹€.

 

μž…λ ₯

첫째 쀄에 μ—°μ‚°μ˜ 개수 N(1≤N≤100,000)이 주어진닀. λ‹€μŒ N개의 μ€„μ—λŠ” 연산에 λŒ€ν•œ 정보λ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ xκ°€ 주어진닀. λ§Œμ•½ xκ°€ μžμ—°μˆ˜λΌλ©΄ 배열에 xλΌλŠ” 값을 λ„£λŠ”(μΆ”κ°€ν•˜λŠ”) 연산이고, xκ°€ 0이라면 λ°°μ—΄μ—μ„œ κ°€μž₯ μž‘μ€ 값을 좜λ ₯ν•˜κ³  κ·Έ 값을 λ°°μ—΄μ—μ„œ μ œκ±°ν•˜λŠ” κ²½μš°μ΄λ‹€. μž…λ ₯λ˜λŠ” μžμ—°μˆ˜λŠ” 2^31보닀 μž‘λ‹€.

 

좜λ ₯

μž…λ ₯μ—μ„œ 0이 주어진 회수만큼 닡을 좜λ ₯ν•œλ‹€. λ§Œμ•½ 배열이 λΉ„μ–΄ μžˆλŠ” 경우인데 κ°€μž₯ μž‘μ€ 값을 좜λ ₯ν•˜λΌκ³  ν•œ κ²½μš°μ—λŠ” 0을 좜λ ₯ν•˜λ©΄ λœλ‹€.

 

예제 μž…λ ₯1

9
0
12345678
1
2
0
0
0
0
32

 

예제 좜λ ₯1

0
1
2
12345678
0

 

생각

* MeanHeap(λ‚΄λ¦Όμ°¨μˆœ) *

priority_queue <int, vector<int> > pq; push(-x); -top();

priority_queue <int, vector<int>, greater<int> > pq;

 

 

μž‘μ„±ν•œ μ½”λ“œ

#include <iostream>
#include <queue>

using namespace std;

int main(int argc, const char * argv[]) {
    // insert code here...
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    priority_queue<int, vector<int> > pq;
    int n,x;
    
    cin >> n;
    for(int i=0; i<n; i++){
        cin >> x;
        if(x>0){
            pq.push(-x);
        }else if(x==0){
            if(pq.empty()){// 배열이 λΉ„μ–΄μžˆλŠ” 경우
                cout << 0 << "\n";
            }else{
                cout << -pq.top() << "\n";
                pq.pop();
            }
        }
    }
}

λ°˜μ‘ν˜•
Comments