[BOJ]21944 - 문제 추천 시스템 Version 2(G2)

suhyun·2022년 12월 23일
0

백준/프로그래머스

목록 보기
51/81

문제 링크

21944-문제 추천 시스템 Version 2


입력

첫 번째 줄에 추천 문제 리스트에 있는 문제의 개수 N이 주어진다.
두 번째 줄부터 N+1 줄까지 문제 번호 P와 난이도 L, 알고리즘 분류 G가 공백으로 구분되어 주어진다.
N+2 줄은 입력될 명령문의 개수 M이 주어진다.
그 다음줄부터 M개의 위에서 설명한 명령문이 입력된다.

출력

recommend, recommend2, recommend3 명령이 주어질 때마다 문제 번호를 한 줄씩 출력한다. 주어지는 recommend, recommend2, recommend3 명령어의 총 개수는 최소 1개 이상이다.


문제 풀이

pq는 [이전 버전] 이랑 다를거 없이
난이도 순으로 정렬하고, 같은 난이도에 대해서는 문제 번호 순으로 정렬한 TreeSet이다.

알고리즘에 대해서는 딱히 정렬에 대해서 신경 안써도 되기 때문에 그냥 Map을 이용

즉, levelmap과 algomap은 문제 번호를 키값으로 하고 각각 난이도, 알고리즘을 value값으로 가지는 자료형으로 solvedcommand를 풀기 위해서 추가했다.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {
    public static class Problem implements Comparable<Problem> {
        int idx;
        int level;

        public Problem(int idx, int level) {
            this.idx = idx;
            this.level = level;
        }

        public int compareTo(Problem o) {
            if (level - o.level == 0) {
                return idx - o.idx;
            } else {
                return level - o.level;
            }
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int N = Integer.parseInt(st.nextToken());
        TreeSet<Problem> pq = new TreeSet<>();
        Map<Integer, Integer> map = new HashMap<>();

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            int idx = Integer.parseInt(st.nextToken());
            int level = Integer.parseInt(st.nextToken());
            pq.add(new Problem(idx, level));
            map.put(idx, level);
        }

        st = new StringTokenizer(br.readLine());
        int M = Integer.parseInt(st.nextToken());
        for (int i = 0; i < M; i++) {
            st = new StringTokenizer(br.readLine());
            String cmd = st.nextToken();
            if (cmd.equals("add")) {
                int p = Integer.parseInt(st.nextToken());
                int l = Integer.parseInt(st.nextToken());
                pq.add(new Problem(p, l));
                map.put(p, l);
            }
            if (cmd.equals("recommend")) {
                int x = Integer.parseInt(st.nextToken());
                if (x == 1) {
                    System.out.println(pq.last().idx);
                } else if (x == -1) {
                    System.out.println(pq.first().idx);
                }
            }
            if (cmd.equals("solved")) {
                int p = Integer.parseInt(st.nextToken());
                pq.remove(new Problem(p, map.get(p)));
                map.remove(p);
            }
        }
    }
}

profile
꾸준히 하려고 노력하는 편 💻

0개의 댓글