티스토리 뷰
문제
- 이중 우선순위 큐는 전형적인 우선순위 큐처럼 데이터를 삽입, 삭제할 수 있음
- 차이점은 데이터를 삭제할 때 연산 명령에 따라 우선순위가 가장 높은 데이터 또는 가장 낮은 데이터 중 하나를 삭제하는 것
- 각 줄에 연산을 나타내는 문자('D' 또는 'I')와 정수 n이 주어짐
- 'I n'은 정수 n을 큐에 삽입하는 연산 (동일한 정수가 삽입될 수 있음)
- 'D 1'는 큐에서 최댓값 삭제 / 'D -1'는 큐에서 최솟값 삭제 (최댓값, 최솟값이 둘 이상인 경우 하나만 삭제 됨)
- 큐가 비어있는데 적용할 연산이 'D'라면 무시 가능
- 모든 연산을 처리하고 최종적으로 큐에 저장된 데이터 중 최댓값과 최솟값 출력
해결방법
TreeMap 자료 구조를 활용하여 문제를 해결하였다. 숫자와 해당 숫자가 들어있는 개수를 함께 treemap에 저장할 수 있도록 구성하였다. 삽입 과정에서 getOrDefault 메서드를 사용하여 각 숫자가 몇개가 포함되어 있는지 확인할 수 있도록 하였다. getOrDefault 메서드에 대한 자세한 사용법은 아래 포스팅을 확인하면 좋을 것 같다.
[자료구조] TreeMap - getOrDefault
getOrDefault(Object Key, V DefaultValue) - 찾는 키가 존재한다면 찾는 키의 값을 반환하고 없다면 기본 값을 반환하는 메서드 - Key : 값을 가져와야 하는 요소의 키 - DefaultValue : 지정된 키로 매핑된 값이
sa11k.tistory.com
삭제 과정에서는 연산 내용(1, -1)에 따라 treemap에 저장된 숫자들 중에서 최댓값, 최솟값을 구해서 개수를 줄여주거나 개수가 1개인 경우엔 삭제할 수 있도록 하였다.
코드
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = Integer.parseInt(br.readLine());
for(int tc = 1; tc<=T; tc++) {
int k = Integer.parseInt(br.readLine());
TreeMap<Integer, Integer> treemap = new TreeMap<>();
for(int i = 0; i<k; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
// 삽입 연산
if(st.nextToken().equals("I")) {
int num = Integer.parseInt(st.nextToken());
// 해당 숫자가 있는지 확인하여 개수와 함께 저장
treemap.put(num, treemap.getOrDefault(num, 0) + 1);
}
// 삭제 연산
else {
int num = Integer.parseInt(st.nextToken());
// 최댓값 삭제
if(num == 1) {
if(treemap.size() == 0) continue;
// 최댓값 개수 받아오기
int value = treemap.get(treemap.lastKey());
// 개수가 1개라면 아예 treemap에서 삭제
if(value == 1) treemap.remove(treemap.lastKey());
// 1개 이상이라면 개수 -1
else treemap.put(treemap.lastKey(), value-1);
}
// 최솟값 삭제
else {
if(treemap.size() == 0) continue;
// 최솟값 개수 받아오기
int value = treemap.get(treemap.firstKey());
// 개수가 1개라면 아예 treemap에서 삭제
if(value == 1) treemap.remove(treemap.firstKey());
// 1개 이상이라면 개수 -1
else treemap.put(treemap.firstKey(), value-1);
}
}
}
// treemap이 비었다면 EMPTY 출력
if(treemap.size() == 0) System.out.println("EMPTY");
// 최댓값 최솟값 출력
else System.out.println(treemap.lastKey() + " " + treemap.firstKey());
}
}
}
'Algorithm > Baekjoon' 카테고리의 다른 글
[백준] 5427번 불 (JAVA) (0) | 2023.02.27 |
---|---|
[백준] 1926번 그림 (JAVA) (0) | 2023.02.27 |
[백준] 1477번 휴게소 세우기 (JAVA) (0) | 2023.02.26 |
[백준] 1781번 컵라면 (JAVA) (0) | 2023.02.26 |
[백준] 15810번 풍선 공장 (JAVA) (0) | 2023.02.26 |