1. ๋ฌธ์ ์ค๋ช
2. ์ ๊ทผ ๋ฐฉ์
TreeMap์ ์ด์ฉํด์ ์ ๊ทผํ๋ค.
TreeMap์ Key ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ ์๋ฃ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค. ์ ๋ ฌ ๊ธฐ์ค์ default๊ฐ ์ค๋ฆ ์ฐจ์์ด๊ณ , ๋งค๊ฐ๋ณ์๋ก Comparator๋ฅผ ๋ฃ์ด์ ๋ฐ๊ฟ ์ ์๋ค. ์ด๋ ์ฃผ์ํ ๊ฒ์ ๋์๊ด๊ณ ๋น๊ต๋ "Key" ๊ฐ์ผ๋ก ์ด๋ฃจ์ด์ง๋ค๋ ๊ฒ์ด๋ค.
TreeMap<Student,String> map = new TreeMap<>((o1,o2) -> (return Integer.compare(o1.score, o2.score)));
์ฌ๊ธฐ์ ์ฃผ์ํด์ผํ ์ ์
- ๊ฐ์ ์ค๋ณต์ด ์๋ค.
- ์ต๋๊ฐ, ์ต์๊ฐ ์ค ์ด๋ ๊ฒ๋ ๋น ์ ธ๋๊ฐ ์ ์๋ค.
์ด๋ค.
๋คํํ TreeMap์ deque์ฒ๋ผ rear๋ถ๋ถ๊ณผ front ๋ถ๋ถ์ ๋ ๋ค ์กฐํ ๊ฐ๋ฅํ๋ค. (์ญ์ ๋ ๋ฐ๋ก๋ฐ๋ก ๋ ๊ฒ ๊ฐ์๋ฐ, ์ด ๋ถ๋ถ์ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๋ ์ฐพ์๋ด์ผ๊ฒ ๋ค.)
map.firstKey() -> ์ค๋ฆ ์ฐจ์ ์ ๋ ฌ ์, ๊ฐ์ฅ ์์ ๊ฐ,
map.lastKey() -> ์ค๋ฆ ์ฐจ์ ์ ๋ ฌ ์, ๊ฐ์ฅ ํฐ ๊ฐ
์์ ์ ์ํด์, ๊ฐ ๋ช
๋ น์ด์ ๋ง๊ฒ ์ญ์ ํ๋ค. ๋ค๋ง ์ค๋ณต๋๋ ๊ฐ์ด ๋ค์ด์ค๋ฉด ํด๋น ๊ฐ์ key๋ก ๊ฐ์ง๋ value๋ฅผ 1์ฌ๋ฆฐ๋ค. ๋ง์ฝ 93์ด 2๋ฒ ๋ค์ด์ค๋ฉด <key,value> = <93,2> ๊ฐ ๋๋ค. ์ญ์ ํ ๋๋ value๋ฅผ ๋ค ๊น๊ณ , ๋ง์ฝ์ value๊ฐ 0์ด ๋๋ฉด ํด๋น entry๋ฅผ map์์ ์ง์ฐ๋ฉด ๋๋ค.
3. ์ฝ๋ ๋ถ์
import java.io.*;
import java.util.*;
class Solution {
public int[] solution(String[] operations) {
TreeMap<Integer,Integer> map = new TreeMap<>();
for(int i = 0; i < operations.length; i++){
StringTokenizer st = new StringTokenizer(operations[i]);
String order = st.nextToken();
switch(order){
case "I": {
int v = Integer.parseInt(st.nextToken());
if(map.get(v) == null){
map.put(v, 1);
}else {
map.put(v, map.get(v)+1);
}
break;
}
case "D": {
if(map.isEmpty()) break;
int order2 = Integer.parseInt(st.nextToken());
int k = 0;
if(order2 == 1) {
k = map.lastKey();
}else {
k = map.firstKey();
}
if(map.get(k) >= 2) {
map.put(k, map.get(k)-1);
}else if(map.get(k) == 1){
map.remove(k);
}
break;
}
}
}
if(map.size() == 0) return new int[]{0,0};
else {
return new int[]{map.lastKey(), map.firstKey()};
}
}
}
4. ์ฑ์ฅ ํ๊ธฐ
TreeMap์ ์ฐ์ง ์์ ์ฌ๋๋ค์ ํ์ด๊ฐ ํฅ๋ฏธ๋ก์ ๋ค.
๋ค๋ฅธ ํ์ด๋ก๋ ์ฐ์ ์์ํ๋ฅผ 2๊ฐ ๋ง๋ค๊ณ , HashMap์ ์ฌ์ฉํ๋ค. map์ ํด๋น ๊ฐ์ด ์ค์ ๋ก ์กด์ฌํ๋์ง์ ๋ํ ๋ช
๋ถ๋ผ๊ณ ๋ณด์๋ฉด ๋๋ค.
- ์ค๋ฆ ์ฐจ์ ์ ๋ ฌ๋ ์ฐ์ ์์ ํ(A)์ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ๋ ์ฐ์ ์์ ํ(B)๋ฅผ ๋๋ค.
- ๊ฐ ์ฝ์ ์์๋ ๋ ํ์ ์ ๋ถ ์ฝ์ ๋ฐ, map์๋ ๊ฐ์ ์ ์ด๋๋๋ค.
- ์ต์๊ฐ ์ญ์ ์, A์์ ๊ฐ์ ์ญ์ ํ๋ค. ๋ค๋ง ์ด๋, ์ญ์ ํ๋ ค๊ณ ๋ดค๋ A.poll()ํ ์๊ฐ ๋ช ๋ถ์ ์๋ ๊ฐ์ด๋ผ๋ฉด, ์ด๋ฏธ ๋ค๋ฅธ ๋ช ๋ น์ด์ ์ํด ์ญ์ ๋ ์ซ์ ์์ผ๋ก, ๋ค์ ์ญ์ ํ๋ค๋ ๊ฒ์ด ๋ฌด์๋ฏธ ํ๋ค. ๋ฐ๋ผ์ ๋ช ๋ถ์ ์กด์ฌํ๋ ๊ฐ์ด ๋์ฌ ๋๊น์ง queue์์ poll() ํ๋ค. (์ต๋๊ฐ๋ ๋ง์ฐฌ๊ฐ์ง)
- ๋ช ๋ น์ด ๊ณ์ฐ์ด ๋๋ ํ์๋ KeySet()์ ๋ฝ์์, ์ต๋๊ฐ๊ณผ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
๋๋ ์ : map์ ๋งค์๋๋ค๊ณผ ๋ ์ต์ํด์ ธ์ผ๊ฒ ๋ค. treeMap์ ๋งค์๋๋ ์์๋ฌ์ผ๊ฒ ๋ค๋ ์๊ฐ์ด ๋ ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฒ์์๋ ์ฐ์ ์์ Queue์ remove()๋ผ๋ ํจ์๋ฅผ ์ฐ๋ ค๊ณ ํ๋๋ฐ ํด๋น ํจ์๋ ๋ชจ๋ ๊ฐ์ ์ ํ์ ์ผ๋ก ๋์์ ์ฌ์ฉ์๊ฐ ์ํ๋ ๊ฐ์ ์ฐพ์๋ธ ๋ค ์ญ์ ํ๋ ๊ฒ์ด๋ผ O(n)์ ์๊ฐ๋ณต์ก๋๊ฐ ๋ ๋ค. ์ด ๋๋ฌธ์ ์๊ฐ์ด๊ณผ๊ฐ ๋ง์ด ๋ฌ์๋ค. queue์ remove()๋ ์ ํ์ ์ธ ์กฐํ๋ฅผ ํด์ ์ญ์ ์๋๊ฐ ๋๋ฆฌ๋ค๋ ๊ฒ์ ์๊ณ ๊ฐ์.
5. ๋ค๋ฅธ ํ์ด
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st;
TreeMap<Integer, Integer> map = new TreeMap();
int T = Integer.parseInt(br.readLine());
for (int t=0; t<T; t++) {
int k = Integer.parseInt(br.readLine());
char command;
int num;
int targetNum;
for (int i=0; i<k; i++) {
st = new StringTokenizer(br.readLine());
command = st.nextToken().charAt(0);
num = Integer.parseInt(st.nextToken());
if (command == 'I') {
map.put(num, map.getOrDefault(num, 0) + 1);
} else if (!map.isEmpty()) {
if (num == -1) {
targetNum = map.firstKey();
if (map.get(targetNum) == 1) {
map.remove(targetNum);
} else {
map.put(targetNum, map.get(targetNum) - 1);
}
} else {
targetNum = map.lastKey();
if (map.get(targetNum) == 1) {
map.remove(targetNum);
} else {
map.put(targetNum, map.get(targetNum) - 1);
}
}
}
}
if (map.isEmpty()) {
sb.append("EMPTY");
} else {
sb.append(map.lastKey()).append(' ').append(map.firstKey());
}
sb.append('\n');
map.clear();
}
System.out.println(sb);
}
}