λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

πŸ“ μ•Œκ³ λ¦¬μ¦˜/BOJ

[C++/BOJ] 11286 : μ ˆλŒ“κ°’ νž™ (자료ꡬ쑰)

728x90

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

 

문제

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

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

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

μž…λ ₯

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

좜λ ₯

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


 

μš°μ„ μˆœμœ„ 큐둜 ν•΄κ²°ν•΄μ•Ό ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

 

ν•œκ°€μ§€ μœ μ˜ν•  점은,

 

priority_queueλŠ” κ°€μž₯ 큰 수λ₯Ό top으둜 두도둝 μžλ™μ •λ ¬λ˜κΈ° λ•Œλ¬Έμ—,
 
이 문제λ₯Ό μœ„ν•΄μ„œλŠ” κ°€μž₯ μž‘μ€ 수λ₯Ό top으둜 λ‘λŠ” 정렬을 μœ„ν•œ structλ₯Ό λ”°λ‘œ μ§€μ •ν•΄μ€˜μ•Ό ν•©λ‹ˆλ‹€!
 
 
κ·Έλž˜μ„œ μžλ™μ •λ ¬ ν›„ top을 좜λ ₯ν•΄μ£Όκ³  popν•΄μ£Όλ©΄, 방금 좜λ ₯ν–ˆλ˜ top이 νŠ€μ–΄λ‚˜μ˜΅λ‹ˆλ‹€

 

 

λ‚˜μ˜ 풀이

#include <iostream>
#include <string>
#include <queue>
#include <vector>
using namespace std;

struct comp{
    bool operator()(int a,int b){
        // μ›λž˜ μš°μ„ μˆœμœ„νλŠ” κ°€μž₯ 큰 μˆ˜κ°€ top.
        // top에 κ°€μž₯ μž‘μ€ μˆ˜κ°€ μ™€μ•Όν•˜λ―€λ‘œ λ‚΄λ¦Όμ°¨μˆœ μ •λ ¬
        if(abs(a)==abs(b)){
            return a > b;
        }
        else
            return abs(a) > abs(b);
    }
};

int main(){
    priority_queue< int, vector<int>, comp > pq;
    int n;
    int x;
    cin >> n;
    for (int i = 0; i < n; ++i){
        cin >> x;
        if(x == 0){
            if(pq.empty()) cout << 0 << '\n';
            else {
                cout << pq.top() << '\n';
                pq.pop();
            }
        }
        else pq.push(x);
    }
}

 

728x90