본문 바로가기

Language/C++

[c++][백준 21939][multiset] 문제 추천 시스템 Version 1 - 컴도리돌이

728x90
728x90

 

21939번: 문제 추천 시스템 Version 1

tony9402는 최근 깃헙에 코딩테스트 대비 문제를 직접 뽑아서 "문제 번호, 난이도"로 정리해놨다. 깃헙을 이용하여 공부하시는 분들을 위해 새로운 기능을 추가해보려고 한다. 만들려고 하는 명령

www.acmicpc.net


해당 문제는 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;
}

728x90
728x90