해당 문제는 multiset을 이용해서 풀었다. multiset을 값을 삽입할 때 작은 수부터 정렬되어서 삽입이 되는 특징이 있고, 삭제도 해당 값만 안다면 쉽게 삭제도 할 수 있기에 multiset을 이용해서 문제를 풀었다.
먼저 입력을 받을 때 문제 번호와 난이도 순으로 받는다. 나는 해당 값을 {난이도, 문제 번호} 순으로 multiset 함수에 집어넣었다. 그리고 나중에 삭제를 할 때 해당 값을 온전히 받아야 하기에 map 함수를 이용해서 문제 번호에 대한 난이도 값을 mapping 시켰다.
이렇게 입력을 하면 이문제는 90%는 해결되었다. 이제부터는 multiset 함수의 특징만 용이하게 사용하면 된다.
recommend x 값이 들어올 경우 :
1. x == 1일 때 난이도가 가장 어려운 문제 번호를 출력해야 한다. multiset 함수에서 가장 끝에 있는 값의 문제 번호를 출력한다. 여기서 가장 끝 값을 해당 함수의 end() 앞의 값이 될 것이다. 그렇기에 prev(ms.end())를 사용해서 end() 앞의 값에 접근했다. 물론 prev 함수를 모를 경우 (--ms.end())로 접근해도 무방하다.
2. x == -1일 때 난이도가 가장 쉬운 문제 번호를 출력해야 한다. 요번에는 multiset 함수에서 가장 앞에 있는 값을 출력하면 된다.
삭제 연산일 할 때는 처음에 mapping 시킨 map 함수에서 문제 번호에 대한 난이도 값을 알아 온다. 그다음에 우리가 설정한 입력 값에 맞춰서 해당 값을 입력해서 삭제시키면 된다. {난이도(map 함수로 찾은 난이도), 문제 번호}
#include<iostream>
#include<string>
#include<set>
#include<map>
using namespace std;
int n,m;
multiset<pair<int,int>> ms;
map<int,int> mm;
void solution(){
ios_base::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n;
for(int i=0,p,l; i<n ; i++){
cin >> p >> l;
ms.insert({l,p});
mm[p] = l;
}
cin >> m;
for(int i=0; i< m ;i++){
string op;
cin >> op;
if(op == "add"){
int p,l;
cin >> p >> l;
ms.insert({l,p});
}
else if(op == "recommend"){
int x;
cin >> x;
if(x == 1){
cout << prev(ms.end())->second << '\n';
}
else{
cout << ms.begin()->second << '\n';
}
}
else if(op == "solved"){
int p;
cin >> p;
ms.erase({mm[p],p});
}
}
}
int main(){
solution();
return 0;
}
'Language > C++' 카테고리의 다른 글
[c++][백준 22856][그래프탐색] 트리 순회 - 컴도리돌이 (0) | 2022.03.05 |
---|---|
[c++][백준 21940][플로이드-와샬] 가운데에서 만나기 - 컴도리돌이 (0) | 2022.03.04 |
[c++][백준 21944][multiset + map] 문제 추천 시스템 Version2 - 컴도리돌이 (2) | 2022.03.04 |
[c++][백준 21942][해시/파싱] 부품 대여장 - 컴도리돌이 (0) | 2022.03.04 |
[c++][백준 21937][bfs] 작업 - 컴도리돌이 (0) | 2022.03.04 |