728x90
실패한 내 풀이.
remove하는 것이 O(N)이라서 TImeLimit에 걸린것이다.
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
PriorityQueue<Integer> minQueue = new PriorityQueue<>(); // 최솟값 큐
PriorityQueue<Integer> maxQueue = new PriorityQueue<>(Collections.reverseOrder()); // 최댓값 큐
/*
D or I와 정수 n
I n은 정수 n을 Q에 삽입하는 연산
D 1 최대값 삭제
D -1 최솟값 삭제
Queue 비어있으면 D연산무시.
output : 남은 값중 최대와 최소. 두값을 하나의 줄, 하나의 공백
Q가 비어있다면 EMPTY출력
*/
int T = sc.nextInt(); // 테스트 케이스 수
for (int i = 0; i < T; i++) {
int num = sc.nextInt();
for (int j = 0; j < num; j++) {
char c = sc.next().charAt(0);
if (c == 'I') {
int number = sc.nextInt();
minQueue.add(number);
maxQueue.add(number);
} else if (c == 'D') {
int n = sc.nextInt();
if (n == -1 && !minQueue.isEmpty()) {
int min = minQueue.poll();
maxQueue.remove(min);
} else if (n == 1 && !maxQueue.isEmpty()) {
int max = maxQueue.poll();
minQueue.remove(max);
}
}
}
if (minQueue.isEmpty() && maxQueue.isEmpty()) {
System.out.println("EMPTY");
} else {
// 최대값과 최소값 출력
System.out.println(maxQueue.peek() + " " + minQueue.peek());
}
minQueue.clear();
maxQueue.clear();
}
}
}
두번째 풀이:
treemap을 사용하였다. treeset과 달리 map은 2개의 값을 저장할 수 있기때문이다.
import java.util.*;
public class BJ7662 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
PriorityQueue<Integer> minQueue = new PriorityQueue<>(); // 최솟값 큐
PriorityQueue<Integer> maxQueue = new PriorityQueue<>(Collections.reverseOrder()); // 최댓값 큐
/*
D or I와 정수 n
I n은 정수 n을 Q에 삽입하는 연산
D 1 최대값 삭제
D -1 최솟값 삭제
Queue 비어있으면 D연산무시.
output : 남은 값중 최대와 최소. 두값을 하나의 줄, 하나의 공백
Q가 비어있다면 EMPTY출력
*/
int T = sc.nextInt(); // 테스트 케이스 수
for (int i = 0; i < T; i++) {
int num = sc.nextInt();
TreeMap<Integer, Integer> map = new TreeMap<>(); // TreeMap 사용
for (int j = 0; j < num; j++) {
char c = sc.next().charAt(0);
int number = sc.nextInt();
if (c == 'I') { // 삽입 연산
map.put(number, map.getOrDefault(number, 0) + 1);
} else if (c == 'D') { // 삭제 연산
if (map.isEmpty()) {
continue;
}
if (number == 1) { // 최댓값 삭제
int max = map.lastKey();
if (map.get(max) == 1) {
map.remove(max);
} else {
map.put(max, map.get(max) - 1);
}
} else if (number == -1) { // 최솟값 삭제
int min = map.firstKey();
if (map.get(min) == 1) {
map.remove(min);
} else {
map.put(min, map.get(min) - 1);
}
}
}
}
if (map.isEmpty()) {
System.out.println("EMPTY");
} else {
System.out.println(map.lastKey() + " " + map.firstKey()); // 최대값과 최소값 출력
}
}
}
}
728x90
'백준' 카테고리의 다른 글
백준 1476 - Java (0) | 2024.11.02 |
---|---|
백준 18111-Java (0) | 2024.11.01 |
백준 10026- java (0) | 2024.10.31 |
백준 11724 - Java (0) | 2024.10.26 |
백준 21736 - Java (0) | 2024.10.25 |