Koala - 4기

[BOJ] 22252 정보상인 호석

코딩하는쉐프 2021. 7. 24. 01:05

크게 봤을 때 정보를 저장하고, 원하는 만큼 삭제하는 문제였다.

이름, 정보의 개수, 정보의 가치가 가장 주된 내용이었다. 

쿼리의 처음 입력 값이 1 일 때와 2일 때를 나눠 구분해

1이면 정보 저장

이름에 해당하는 정보들을 우선순위 큐에 집어 넣으면 된다고 생각했다. 

map<string, priority_queue<int>> query;

으로 선언해 해당 정보상인의 정보들을 저장한다.

2이면 정보 삭제를 하면 된다.

원하는 정보의 개수인 b 만큼 우선순위 큐에서 pop하면 된다.

우선순위가 정해져 있기 때문에 top()을 b번 pop한다

pop한 값들을 모두 더하면 답이 된다.

처음에는 아무 생각 없이 답을 int로 선언했다가 틀렸었다.

이를 long long으로 선언하니 풀렸다.

#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <map>
#include <string>
#include <functional>

using namespace std;


// 어떤 이름을 가진 고릴라가 , , ...,  만큼의 가치가 있는 정보 k 개를
// 가치 순으로 가장 비싼 정보들을 구매
// 1번 거래한 정보는 호석이에게 더 이상 가치가 없기 때문에 고릴라도 그 정보를 파기
// 1 Name   : 이름이 [Name]k, Ck인 고릴라가  b개의 정보를 얻었으며, 각 가치는  c1부터 ck 이다.
// 1로 시작하는 경우에는 정보를 얻은 정보 고릴라의 이름과  가 주어지며 이어서  개의 정보 가치 가 자연수로 주어진다
// 2 Name  : 호석이가 이름이 [Name]인 고릴라에게  개의 정보를 구매한다. 이때 고릴라가 가진 정보들 중 가장 비싼  개를 구매하며, 고릴라가 가진 정보가 개 이하이면 가진 모든 정보를 구매한다.
// 2로 시작하는 경우에는 호석이가 거래하려는 정보 고릴라의 이름과 구매하려는 정보의 개수 b가 주어진다. 


int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    map<string, priority_queue<int>> query;
    long long ans = 0;
    int q; cin >> q;
    for(int i=0; i<q; i++){
        int type; cin >> type;
        string name; int k, b;
        if(type == 1){
            cin >> name >> k;
            for(int j = 0; j<k; j++){
                int tmp; cin >> tmp;
                query[name].push(tmp);
            }
        }
        else{
            cin >> name >> b;
            while(!query[name].empty() && b!=0){
                ans += query[name].top();
                query[name].pop();
                b--;
            }
        }
    } 
    cout << ans << "\n";
}

 

2이면 정보 삭제를 하면된다.