πŸ’»

[λ°±μ€€] μš°μ„ μˆœμœ„ 큐 - 11286. μ ˆλŒ“κ°’ νž™ λ³Έλ¬Έ

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

[λ°±μ€€] μš°μ„ μˆœμœ„ 큐 - 11286. μ ˆλŒ“κ°’ νž™

λ˜νš¨λ‹ˆ 2020. 2. 13. 01:26

문제

μ ˆλŒ“κ°’ νž™μ€ λ‹€μŒκ³Ό 같은 연산을 μ§€μ›ν•˜λŠ” μžλ£Œκ΅¬μ‘°μ΄λ‹€.

  1. 배열에 μ •μˆ˜ x (x ≠ 0)λ₯Ό λ„£λŠ”λ‹€.
  2. λ°°μ—΄μ—μ„œ μ ˆλŒ“κ°’μ΄ κ°€μž₯ μž‘μ€ 값을 좜λ ₯ν•˜κ³ , κ·Έ 값을 λ°°μ—΄μ—μ„œ μ œκ±°ν•œλ‹€. μ ˆλŒ“κ°’μ΄ κ°€μž₯ μž‘μ€ 값이 μ—¬λŸ¬κ°œμΌ λ•ŒλŠ”, κ°€μž₯ μž‘μ€ 수λ₯Ό 좜λ ₯ν•˜κ³ , κ·Έ 값을 λ°°μ—΄μ—μ„œ μ œκ±°ν•œλ‹€.

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

 

μž…λ ₯

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

 

좜λ ₯

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

 

예제 μž…λ ₯1

18
1
-1
0
0
0
1
1
-1
-1
2
-2
0
0
0
0
0
0
0

 

예제 좜λ ₯1

-1
1
0
-1
-1
1
1
-2
2
0

 

생각

β€» μš°μ„ μˆœμœ„ 큐

μš°μ„ μˆœμœ„ 큐 쀑 μ΅œλŒ“κ°’μ„ λ‚΄λ†“λŠ” 것을 Max Heap(λ‚΄λ¦Όμ°¨μˆœ), μ΅œμ†Ÿκ°’μ„ λ‚΄λ†“λŠ” 것을 Min Heap(μ˜€λ¦„μ°¨μˆœ)이라고 λΆ€λ₯Έλ‹€.

 

Max Heap을 μ‚¬μš©ν•  λ•Œ

1. priority_queue< int, vector<int> > pq;

2. priority_queue< int, vector<int>, less<int> > pq; 

3. priority_queue< pair<int, int> > pq;

 

Min Heap을 μ‚¬μš©ν•  λ•Œ

1. priority_queue< int, vector<int> > pq; push(-x) & -top() 같이 μ‚¬μš© ν•  μˆ˜μžˆλ‹€. 

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

3. priority_queue< pair<int, int> > pq;λ₯Ό μ“°κ³  push(-x) & -top() 둜 μ‚¬μš©ν•œλ‹€. 

 

*pair<a, b>일 λ•Œ, a의 값이 κ°™λ‹€λ©΄ b의 값에 따라 μš°μ„ μˆœμœ„κ°€ κ²°μ •λœλ‹€.

*push()λ‚˜ pop()을 ν•  λ•Œμ˜ μ‹œκ°„λ³΅μž‘λ„λŠ” logN이닀.

 

 

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

#include <iostream>
#include <algorithm>
#include <queue>
#include <cstdlib>

#define MAX 10000
using namespace std;
int n, x;

int main(int argc, const char * argv[]) {
    // insert code here...
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    
    priority_queue<pair<int, int> > pq;
    
    cin >> n;
    
    for(int i=0; i<n; i++) {
        cin >> x;
        if(x==0){
            if(pq.empty()){ //λΉ„μ—ˆμœΌλ©΄ 0 좜λ ₯
                cout << 0 << "\n";
            }else{
                cout << -pq.top().second <<"\n"; // pairμ΄λ―€λ‘œ λ‘λ²ˆμ§Έκ°’μ΄ μ°Ύκ³ μžν•˜λŠ”
                pq.pop();
            }
        }else{
            pq.push({-abs(x), -x});
        }
    }
    return 0;
}

λ°˜μ‘ν˜•
Comments