-
[백준] 7662 이중 우선순위 큐 #JAVA #이진 탐색 트리Algorithm Solving/BAEKJOON 2021. 12. 24. 18:15
[백준] 7662 이중 우선순위 큐 #JAVA #이진 탐색 트리
코드
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Map.Entry; import java.util.StringTokenizer; import java.util.TreeMap; 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; int T = Integer.parseInt(br.readLine()); for (int t = 0; t < T; t++) { int k = Integer.parseInt(br.readLine()); TreeMap<Integer, Integer> tree = new TreeMap<>(); for (int i = 0; i < k; i++) { st = new StringTokenizer(br.readLine()); String cmd = st.nextToken(); int number = Integer.parseInt(st.nextToken()); if (cmd.equals("I")) { if(tree.get(number) != null) { tree.put(number, tree.get(number)+1); }else { tree.put(number, 1); } } else if (cmd.equals("D")) { if (tree.isEmpty()) continue; if (number == 1) { // 최댓값 삭제 Entry<Integer, Integer> entry = tree.pollLastEntry(); if(entry.getValue() > 1) { tree.put(entry.getKey(), entry.getValue()-1); } } else if (number == -1) { // 최솟값 삭제 Entry<Integer, Integer> entry = tree.pollFirstEntry(); if(entry.getValue() > 1) { tree.put(entry.getKey(), entry.getValue()-1); } } } } if (tree.isEmpty()) { sb.append("EMPTY"); } else { int max = tree.lastKey(); int min = tree.firstKey(); sb.append(max + " " + min); } sb.append("\n"); } System.out.println(sb.toString()); } }
풀이
문제 제목처럼 이중 우선순위 큐라는 자료구조가 있는 줄 알았다. 그런 자료구조는 자바에 존재하지 않았다.(
다른 언어는 있을지도?)그래서 일단 우선순위 큐를 이용해서 풀었다. 하나의 우선순위 큐를 두고 삭제 시 최소인 경우 poll() 메서드를 사용해서 삭제했고, 최대인 경우는 loop문을 통해 마지막 원소를 찾아 삭제 하려고 했다(loop문을 짜는 순간 시간 초과임을 알았다.)
시간 초과를 해결하기 위해 삭제의 시간복잡도가 O(lonN)인 트리 자료구조를 사용하여 해결하였다.
자바에서는 TreeSet 과 TreeMap 두 가지가 있다. 모두 이진 탐색 트리다.
해당 문제에서는 중복된 수가 입력이 될 수 있으므로 TreeSet을 사용하지 않고 TreeMap을 사용하였다.
주의 사항
- 같은 수가 입력이 될 수 있다. TreeMap을 사용하여 구현하며 중복된 입력시 <key, value>에서 value의 값이 증가하도록 구현한다.
- 삭제 시 value의 값이 1보다 큰 경우 삭제가 아니라, value 값을 -1 한다.
반례
INPUT 1
3
I 100
I 100
D 1OUTPUT 100 100
잘못된 코드나 내용이 있다면 댓글을 남겨주세요. 즉시 수정하도록 하겠습니다! :)
'Algorithm Solving > BAEKJOON' 카테고리의 다른 글
[백준] 18809 Gaaaaaaaaaarden #JAVA #백트래킹 #bfs (0) 2022.01.12 [백준] 1202 보석 도둑 #JAVA #우선순위 큐 (0) 2021.12.26 [백준] 3190 뱀 #JAVA #시뮬레이션 (0) 2021.12.17 [백준] 2461 대표선수 #JAVA #투포인터 (0) 2021.11.27 [백준] 2143 두 배열의 합 #JAVA #이분탐색 (0) 2021.11.18