길민호(ethan.mino)
코딩수첩
길민호(ethan.mino)
전체 방문자
오늘
어제
  • 분류 전체보기 (215)
    • Computer Science (0)
    • Web (6)
      • CSS (0)
      • HTML (0)
    • Node.js (0)
    • Javascript (2)
    • Java (46)
      • Spring (27)
      • Jsp (0)
    • C\C++ (2)
    • Programming (0)
    • AI (0)
    • Database (7)
    • Git (5)
    • Algorithm (119)
      • Stack (0)
      • Queue (0)
      • Linked List (0)
      • Sort (0)
      • Simulation (27)
      • Recursion (0)
      • Backtracking (4)
      • Two Pointer (3)
      • Dynamic Programming (19)
      • Greedy (10)
      • Graph (3)
      • Dijkstra (1)
      • BFS\DFS (8)
      • Floyd (1)
      • MST (4)
      • Tree (4)
      • Binary Search (8)
      • Binary Search Tree (4)
    • IntelliJ (4)
    • Vscode (0)
    • Operating System (0)
    • 후기 (3)
    • 성장일지 (13)
    • 스터디 (7)
    • 설치 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • ㅡ

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
길민호(ethan.mino)

코딩수첩

Algorithm/Binary Search Tree

[백준 21939번] 문제 추천 시스템 Version 1 (C++)

2022. 5. 29. 22:46

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

 

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

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

www.acmicpc.net


문제 추천 시스템은 이진 검색 트리를 이용하여 해결할 수 있습니다.

 

이진 검색 트리를 이용하면, 최대/최소값 구하기, 삽입, 삭제을 모두 O(logN)에 수행할 수 있습니다.

 

또한, 이진 검색 트리에 {l, p}를 삽입하면, 먼저, 난이도를 기준으로 정렬하고, 난이도가 같을 땐 문제 번호로 정렬하므로,

마지막 원소가 난이도가 가장 높으면서, 번호가 가장 큰 번호입니다.

첫번째 원소가 난이도가 가장 낮으면서, 번호가 가장 작은 원소입니다.

 

추가로, solved 명령을 수행할 때, {문제 번호, 난이도} 쌍을 찾기 위해서 map을 사용해주었습니다. 

 

아래는 전체 코드입니다.

 

#include <bits/stdc++.h>
using namespace std;

set<pair<int, int>> db;
map<int, int> dict;
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);

    int n, m; cin >> n;
    for(int i = 0; i < n; i++){
        int p, l; cin >> p >> l;
        db.insert({l, p});
        dict[p] = l;
    }
    
    cin >> m;
    for(int i = 0; i < m; i++){
        string op; cin >> op;

        if(op == "add"){
            int p, l; cin >> p >> l;
            db.insert({l, p});
            dict[p] = l;
        }else if(op == "recommend"){
            int x; cin >> x;
            if(x == -1){    // 가장 쉬운 문제의 번호를 출력
                cout << (*db.begin()).second << "\n";
            }else{  // x == 1, 가장 어려운 문제의 번호를 출력
                cout << (*prev(db.end())).second << "\n";
            }
        }else{  // op == "solved"
            int p; cin >> p;
            db.erase({dict[p], p});
            dict.erase(p);
        }
    }
}

'Algorithm > Binary Search Tree' 카테고리의 다른 글

[백준 19700번] 수업 (C++)  (0) 2022.06.01
[백준 23326번] 홍대 투어리스트 (C++)  (0) 2022.05.29
[백준 1202번] 보석 도둑 (C++)  (0) 2022.05.29
    'Algorithm/Binary Search Tree' 카테고리의 다른 글
    • [백준 19700번] 수업 (C++)
    • [백준 23326번] 홍대 투어리스트 (C++)
    • [백준 1202번] 보석 도둑 (C++)
    길민호(ethan.mino)
    길민호(ethan.mino)
    💻 호기심 많은 서버 개발자 길민호입니다.

    티스토리툴바