0. 문제 링크
https://www.acmicpc.net/problem/7662
7662번: 이중 우선순위 큐
입력 데이터는 표준입력을 사용한다. 입력은 T개의 테스트 데이터로 구성된다. 입력의 첫 번째 줄에는 입력 데이터의 수를 나타내는 정수 T가 주어진다. 각 테스트 데이터의 첫째 줄에는 Q에 적
www.acmicpc.net
1. 문제 핵심
- 우선순위 큐인데 입력받은 값을 양쪽으로 제거할 수 있어야 합니다.
2. 문제 접근
자바의 PriorityQueue는 처음 선언할 때 comparator를 변경할 수 없기 때문에 PQ를 2개 만들던가, 아니면 다른 Collection을 사용해야 한다고 생각은 했습니다.
하지만 PQ를 2개 만들었을 때 가장 높은 데이터를 삭제했을 때 오름차순 PQ에 저장한 해당 데이터를 어떻게 삭제해줄 것이냐를 해결하지 못해서 풀지 못했습니다.'
솔루션을 참고했고 PQ 2개와 Map을 사용한 방법과 TreeMap 하나만 사용하는 풀이 방법이 있었습니다.
- PQ 2개와 Map을 사용하는 방식은 데이터를 입력할 때마다 Map에 해당 데이터를 +1해주고 데이터를 꺼내줄 때 while로 Map에 1 이상 저장되어있는 값을 꺼낼 때까지 계속 꺼내줍니다.
- TreeMap을 몰랐다면 이 방법으로 푸는 것이 확실한 것 같습니다.
- TreeMap은 평소에도 가끔 사용하는 콜렉션이었는데 lastKey()와 firstKey()같은 함수가 있는 줄은 몰랐습니다.
- 선언 방식의 차이였는데
tree <Integer, Integer> map = TreeMap<>();
이 아닌
TreeMap<Integer, Integer> map = TreeMap<>();;
으로 선언을 해주어야했던 것입니다.
TreeMap은 입력받은 Key 값을 자동으로 정렬해주기 때문에 위의 두 함수와 함께 사용하면 매우 쉽게 문제를 해결할 수 있습니다.
3. 코드 분석


첫번째 키와 해당 키를 통해 첫번째 값을 가져오고 해당 숫자가 1개만 있다면 값을 제외해주고 1개 이상 있다면 값을 1개만큼 낮춰줍니다.
4. 베스트 코드 분석
5. 코드
package _22_10_18;
import java.io.*;
import java.util.*;
public class BOJ_G4_이중우선순위큐 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int T = Integer.parseInt(br.readLine());
int N, V;
TreeMap<Integer, Integer> map;
int left = 0, right = 0;
for (int i = 0; i < T; i++) {
map = new TreeMap<>();
N = Integer.parseInt(br.readLine());
for (int j = 0; j < N; j++) {
st = new StringTokenizer(br.readLine());
// check I or D
String iOrD = st.nextToken();
// save I or D
V = Integer.parseInt(st.nextToken());
if (iOrD.equals("I")) {
if (map.get(V) != null)
map.put(V, map.get(V) + 1);
else
map.put(V, 1);
} else {
if (map.size() == 0)
continue;
if (V == -1) {
int firstKey = map.firstKey();
int firstValue = map.get(firstKey);
if (firstValue == 1) {
map.remove(firstKey);
} else {
map.put(firstKey, firstValue - 1);
}
} else {
int lastKey = map.lastKey();
int lastValue = map.get(lastKey);
if (lastValue == 1) {
map.remove(lastKey);
} else {
map.put(lastKey, lastValue - 1);
}
}
}
}
if (map.size() == 0)
System.out.println("EMPTY");
else
System.out.println(map.lastKey() + " " + map.firstKey());
}
}
}

'programming > 알고리즘' 카테고리의 다른 글
[백준, 14719, G5] 빗물 (0) | 2022.10.20 |
---|---|
[백준, 1956, G4] 운동 (0) | 2022.10.20 |
[백준, 13905, G4, MST] 세부 (0) | 2022.10.18 |
[백준, S1, DP] 쉬운 계단 수 (0) | 2022.10.18 |
[백준, G5, 그리디] 강의실 배정 (0) | 2022.10.17 |
댓글