๋ฌธ์
ํ์ด
1๏ธโฃ TreeMap ๊ณผ TreeSet์ ์ด์ฉํ ํ์ด
๐ก ๋ ์ค๋ฅธ Idea
1. ์๊ตฌ์ฌํญ์ ๊ฐ์ฅ ๋์ด๋๊ฐ ๋ฎ์ ๊ฒ์์ ๊ฐ์ฅ ๋ฌธ์ ๋ฒํธ๊ฐ ์์ ๊ฒ๊ณผ ๊ฐ์ฅ ๋์ด๋๊ฐ ๋์ ๊ฒ์์ ๊ฐ์ฅ ๋ฌธ์ ๋ฒํธ๊ฐ ํฐ ๊ฒ์ ์ถ๋ ฅํ๋ผ๊ณ ํ๋ค. ๋ฐ๋ผ์, ๋์ด๋๋ฅผ key๋ก ์ ๋ ฌํด์ฃผ๋TreeMap
์์ value๋ก ๋ฌธ์ ๋ฒํธ์ ํฌ๊ธฐ์์ผ๋ก ์ ๋ ฌํด์ฃผ๋TreeSet
์ ์ฌ์ฉํ๋ฉด ๋๊ฒ ๋ค๊ณ ํ๋จํ๋ค.
2. ๋ํ,solved
์์ฒญ ์ ๋ฌธ์ ๋ฒํธ๋ฅผ ์ ๋ ฅ๋ฐ์ ์ง์์ผ ํ๋๋ฐ, ๋์ด๋๋ฅผ key๋ก์ ๊ฐ๋ ๊ฒฝ์ฐ์ ํ์ํ ์ ์์ผ๋ฏ๋ก
๋ฒํธ๋ฅผ key ๋์ด๋๋ฅผ value ๋ก ๊ฐ๋HashMap
์ ์ถ๊ฐํด์,solved
์์ฒญ ์ ๋ฌธ์ ๋ฒํธ์ ๋ง๋ ๋์ด๋๋ฅผ ์ป์ด์์
๊ทธ ๋์ด๋๋ฅผ ๋ฐํ์ผ๋กTreeMap
์TreeSet
์ ์ ๊ทผํด์ ๋ฌธ์ ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ์๋ค.
import java.util.*;
import java.io.*;
public class Main {
static TreeMap<Integer, TreeSet<Integer>> mapKeyByLevel = new TreeMap<>();
static HashMap<Integer, Integer> mapKeyByProblem = new HashMap<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
String[] input = br.readLine().split(" ");
int P = Integer.parseInt(input[0]);
int L = Integer.parseInt(input[1]);
addProblem(L, P);
mapKeyByProblem.put(P, L);
}
StringBuilder ans = new StringBuilder();
int M = Integer.parseInt(br.readLine());
for (int i = 0; i < M; i++) {
String[] input = br.readLine().split(" ");
String cmd = input[0];
if (cmd.equals("recommend")) {
int num = Integer.parseInt(input[1]);
if (num == 1) {
// ๊ฐ์ฅ ์ด๋ ค์ด ๋ ๋ฒจ์์ ๋ฌธ์ ๋ฒํธ๊ฐ ๊ฐ์ฅ ํฐ ๊ฒ
int problem = mapKeyByLevel.get(mapKeyByLevel.lastKey()).last();
ans.append(problem + "\n");
} else if (num == -1) {
// ๊ฐ์ฅ ์ฌ์ด ๋ ๋ฒจ์์ ๊ฐ์ฅ ๋ฌธ์ ๋ฒํธ๊ฐ ์์ ๊ฒ
Integer problem = mapKeyByLevel.get(mapKeyByLevel.firstKey()).first();
ans.append(problem + "\n");
}
} else if (cmd.equals("add")) {
int P = Integer.parseInt(input[1]);
int L = Integer.parseInt(input[2]);
addProblem(L, P);
mapKeyByProblem.put(P, L);
} else if (cmd.equals("solved")) {
int P = Integer.parseInt(input[1]);
int L = mapKeyByProblem.get(P);
TreeSet<Integer> problems = mapKeyByLevel.get(L);
problems.remove(P);
// ๋ ๋ฒจ์ ํด๋นํ๋ ๋ฌธ์ set์ด ๋น ๊ฒฝ์ฐ ์ ๊ฑฐํด์ฃผ์ด์ผํจ, ์๊ทธ๋ฌ๋ฉด recomment ์ ์๋ฌ ๋ฐ์
if (problems.isEmpty()) {
mapKeyByLevel.remove(L);
}
}
}
System.out.println(ans);
}
private static void addProblem(int L, int P) {
// L์ ํด๋นํ๋ ๋ฌธ์ ๋ชจ์์ด ์๋ ๊ฒฝ์ฐ ์๋ก ์ถ๊ฐ
if (!mapKeyByLevel.containsKey(L)) {
TreeSet<Integer> problems = new TreeSet<>();
problems.add(P);
mapKeyByLevel.put(L, problems);
// ์ด๋ฏธ L์ ํด๋นํ๋ ๋ฌธ์ ๋ชจ์์ง์ด ์์ผ๋ฉด ๊ฑฐ๊ธฐ์ ์ถ๊ฐ
} else {
mapKeyByLevel.get(L).add(P);
}
}
}
๊ฒฐ๊ณผ
TreeMap
๊ณผ TreeSet
์๋ฃ๊ตฌ์กฐ๋ฅผ ์๊ณ ๋ฆฌ์ฆ ํ๋ฉด์ ๋ง์ด ์ฌ์ฉํ์ง ์์์๋๋ฐ,
์ด๋ค ์ง๋จ์์ ์ต๋ ์ต์ ๊ฐ์ ์๊ตฌํ ๋, ๋น ๋ฅด๊ฒ ํด๊ฒฐํ ์ ์์์ ๊ธฐ์ตํ๊ณ ์๋ค๊ฐ ์ ์ ํ๊ฒ ์ ์ฌ์ฉํด์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๋ค.
์๋ํ๋ฉด ๋งค๋ฒ ์ ๋ ฌํ๋ ๊ฒ์ ๋น์ฉ์ด ๋ง์ด ๋ค๊ณ , ์ฐ์ ์์ํ์ ๊ฒฝ์ฐ์๋ ์ต์ ํน์ ์ต๋๋ฅผ ๋น ๋ฅด๊ฒ ์ ๊ทผํ ์ ์์ง๋ง ๊ทธ ๋ฐ๋์ ๊ฒฝ์ฐ์๋ iterator
๋ฅผ ์ฌ์ฉํด์ผํ๊ธฐ ๋๋ฌธ์ O(N) ์ด ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฉ์๋์ first
๋ last
์ ๊ฐ์ ๋ช
์นญ์ด ๊ฐ๋
์ฑ์ ๋์ฌ์ค๋ค ์๊ฐ์ด ๋ค์๋ค.