-
[백준] 21939번 : 문제 추천 시스템 Version 1 - 자바(JAVA)알고리즘/백준 2022. 8. 13. 00:01반응형
https://www.acmicpc.net/problem/21939
21939번: 문제 추천 시스템 Version 1
tony9402는 최근 깃헙에 코딩테스트 대비 문제를 직접 뽑아서 "문제 번호, 난이도"로 정리해놨다. 깃헙을 이용하여 공부하시는 분들을 위해 새로운 기능을 추가해보려고 한다. 만들려고 하는 명령
www.acmicpc.net
문제 해석
문제 번호, 난이도로 정리되어 있습니다.
명령어는 총 3가지가 존재합니다.
recommend x
x가 1인 경우 추천 문제 리스트에서 가장 어려운 문제의 번호를 출력합니다.
가장 어려운 문제가 어려 개라면 문제 번호가 큰 것을 출력합니다.
x가 -1인 경우 가장 쉬운 문제의 번호를 출력합니다.
만약 쉬운 문제가 여러 개라면 문제 번호가 작은 것으로 출력합니다.
add P L
추천 문제 리스트에 난이도가 L인 문제 번호 P를 추가합니다.
solved P
추천 문제 리스트에서 문제 번호 P를 제거합니다.
문제 풀이 전 설계
Map을 통해서 문제 번호와 난이도를 관리합니다.
이때 난이도를 적절한 자료구조를 통해 관리해주어야 Min, Max를 잘 뽑아낼 수 있을 것 같습니다.
우선순위 큐 2개를 활용하여 Min,Max를 추출해내면 될 것 같습니다.
또 하나의 방법으로 TreeSet에서 제공하는 last와 first 메서드를 통해 해결할 수 있습니다.
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*; public class Main_21939_문제추천시스템Version1 { 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 String toString() { return "idx : " + idx + " level : " + level; } } public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int n = Integer.parseInt(br.readLine()); TreeSet<Problem> ts = new TreeSet<>(); Map<Integer, Integer> map = new HashMap<>(); StringTokenizer st = null; for (int i = 0; i < n; i++) { st = new StringTokenizer(br.readLine()); int number = Integer.parseInt(st.nextToken()); int level = Integer.parseInt(st.nextToken()); ts.add(new Problem(number, level)); map.put(number, level); } int m = Integer.parseInt(br.readLine()); for (int i = 0; i < m; i++) { st = new StringTokenizer(br.readLine()); String command = st.nextToken(); if (command.equals("add")) { int number = Integer.parseInt(st.nextToken()); int level = Integer.parseInt(st.nextToken()); ts.add(new Problem(number, level)); map.put(number, level); } if (command.equals("recommend")) { if (Integer.parseInt(st.nextToken()) == 1) { System.out.println(ts.last().idx); } else { System.out.println(ts.first().idx); } } if(command.equals("solved")) { int number = Integer.parseInt(st.nextToken()); ts.remove(new Problem(number, map.get(number))); map.remove(number); } } } }
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 111720번 : 숫자의 합 - 자바(JAVA) (0) 2022.08.19 [백준] 2533번 : 사회망서비스(SNS) - 자바(JAVA) (0) 2022.08.14 [백준] 1062번 : 가르침 - 자바(JAVA) (0) 2022.08.12 [백준] 5430번 : AC - 자바(JAVA) (0) 2022.08.11 [백준] 14889번 : 스타트와 링크 - 자바(JAVA) (0) 2022.08.09