-
BOJ 21944: 문제 추천 시스템 Version 2알고리즘 2023. 7. 18. 00:36
#BOJ 21944: 문제 추천 시스템 Version 2
21944번: 문제 추천 시스템 Version 2
recommend, recommend2, recommend3 명령이 주어질 때마다 문제 번호를 한 줄씩 출력한다. 주어지는 recommend, recommend2, recommend3 명령어의 총 개수는 최소 1개 이상이다.
www.acmicpc.net
#풀이
BOJ21939 와 비슷하지만 조금 추가 된 문제이다.
문제, 난이도, 분류 3가지를 입력
1. recommend
2. recommend2
3. recommend3
4. add
5. solved
BOJ21939와 비슷하게
문제 와 난이도 map, 난이도에 따른 문제 set, 문제와 분류 map 분류에 따른 문제 set을 사용하였다.
set 특성상 정렬되어 있기 때문에 문제 번호를 찾기 쉽다.
#코드
#include<iostream> #include<set> #include<unordered_map> #include<string> #define X first #define Y second using namespace std; int n, p ,m, l, g; set<int> que[102]; // 난이도별로 문제 저장 set <int> type[102]; unordered_map<int, int> que_; // 문제번호를 통해서 난이도 검색 unordered_map<int, int>type_; void recommend(int G, int x) { if (x == 1) { for (int i = 100; i >= 1; i--) { if (que[i].size() == 0) continue; auto a = prev(que[i].end()); while (1) { if (type[G].find(*a) != type[G].end()) { cout << *a << '\n'; return; } if (a == que[i].begin()) break; a = prev(a); } } } else { for (int i = 1; i <= 100; i++) { if (que[i].size() == 0) continue; auto a = que[i].begin(); while (1) { if (a == que[i].end()) break; if (type[G].find(*a) != type[G].end()) { cout << *a << '\n'; return; } a = next(a); } } } } void recommend2(int x) { if (x == 1) { for (int i = 100; i >= 1; i--) { if (que[i].size() == 0) continue; auto a = prev(que[i].end()); cout << *a << '\n'; return; } } else { for (int i = 1; i <= 100; i++) { if (que[i].size() == 0) continue; auto a = que[i].begin(); cout << *a << '\n'; return; } } } void recommend3(int x, int L) { if (x == 1) { for (int i = L; i <= 100; i++) { if (que[i].size() == 0) continue; auto a = que[i].begin(); cout << *a << '\n'; return; } } else { for (int i = L-1; i >= 1; i--) { if (que[i].size() == 0) continue; auto a = prev(que[i].end()); cout << *a << '\n'; return; } } cout << -1 << '\n'; } void add(int num, int diff, int G) { if (que_.find(num) != que_.end()) { if (que_[num] != diff) { int prev = que_[num]; que[prev].erase(num); que_[num] = diff; que[diff].insert(num); } if (type_[num] != G) { int prev = type_[num]; type[prev].erase(num); type_[num] = G; type[G].insert(num); } } else { que_[num] = diff; que[diff].insert(num); type_[num] = G; type[G].insert(num); } } void solve(int num) { int diff = que_[num]; int que_type = type_[num]; que[diff].erase(num); que_.erase(num); type[que_type].erase(num); type_.erase(num); } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i = 0; i < n; i++) { cin >> p >> l >> g; que[l].insert(p); que_[p] = l; type[g].insert(p); type_[p] = g; } cin >> m; for (int i = 0; i < m; i++) { string str; cin >> str; if (str == "recommend") { cin >> p >> l; recommend(p, l); } else if (str == "recommend2") { cin >> p; recommend2(p); } else if (str == "recommend3") { cin >> p >> l; recommend3(p, l); } else if (str == "add") { cin >> p >> l >> g; add(p, l, g); } else { // solved cin >> p; solve(p); } } return 0; }
'알고리즘' 카테고리의 다른 글
BOJ 1715: 카드 정렬하기 (0) 2023.07.18 BOJ 1927: 최소 힙 (0) 2023.07.18 BOJ 23326 : 홍익 투어리스트 (0) 2023.07.14 BOJ 21939 : 문제 추천 시스템 (0) 2023.07.14 BOJ 1351: 무한 수열 (0) 2023.07.13