반응형
[Silver I] 절댓값 힙 - 11286
성능 요약
메모리: 29968 KB, 시간: 808 ms
분류
자료 구조(data_structures), 우선순위 큐(priority_queue)
문제 설명
절댓값 힙은 다음과 같은 연산을 지원하는 자료구조이다.
- 배열에 정수 x (x ≠ 0)를 넣는다.
- 배열에서 절댓값이 가장 작은 값을 출력하고, 그 값을 배열에서 제거한다. 절댓값이 가장 작은 값이 여러개일 때는, 가장 작은 수를 출력하고, 그 값을 배열에서 제거한다.
프로그램은 처음에 비어있는 배열에서 시작하게 된다.
입력
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 절댓값이 가장 작은 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 정수는 -231보다 크고, 231보다 작다.
출력
입력에서 0이 주어진 회수만큼 답을 출력한다. 만약 배열이 비어 있는 경우인데 절댓값이 가장 작은 값을 출력하라고 한 경우에는 0을 출력하면 된다.
풀이방법
양수와 음수의 절댓값이 같을 경우 비교하기 위해 양수 힙과 음수 힙을 따로 나누어 저장했다.
음수 힙은 최대힙을 구하기 위해 Collections.reverseOrder를 이용했다.
해당 방법말고도, compare로 비교하여 자리를 바꾸거나, 음수를 힙에 넣을 때는 양수로 변환하여 넣고 뺄 때는 다시 음수로 변환하여 빼서 비교하는 방법도 가능하다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.PriorityQueue;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PriorityQueue<Integer> plus_heap = new PriorityQueue<>(); // 최소 힙
PriorityQueue<Integer> minus_heap = new PriorityQueue<>(Collections.reverseOrder()); // 최대 힙
int N = Integer.parseInt(br.readLine());
for (int i = 0; i < N; i++) {
int x = Integer.parseInt(br.readLine());
// 양수 힙
if (x > 0) {
plus_heap.add(x);
// 음수 힙
} else if (x < 0) {
minus_heap.add(x);
} else if (x == 0) {
// 1. 두 힙이 존재할 경우
if(!plus_heap.isEmpty() && !minus_heap.isEmpty()) {
//값이 같다면 minus 힙에서 빼기
if(plus_heap.peek() == Math.abs(minus_heap.peek())) {
System.out.println(minus_heap.poll());
}
//값이 다르다면 작은 힙에서 빼기
else if(plus_heap.peek() < Math.abs(minus_heap.peek())) {
System.out.println(plus_heap.poll());
} else if(plus_heap.peek() > Math.abs(minus_heap.peek())) {
System.out.println(minus_heap.poll());
}
}
// 2. 한 힙만 존재할 경우
else if(!plus_heap.isEmpty() && minus_heap.isEmpty()) {
System.out.println(plus_heap.poll());
} else if(plus_heap.isEmpty() && !minus_heap.isEmpty()) {
System.out.println(minus_heap.poll());
}
// 3. 아무것도 존재하지 않을 경우
else if(plus_heap.isEmpty() && minus_heap.isEmpty()) {
System.out.println(0);
}
}
}
}
}
'알고리즘' 카테고리의 다른 글
[Gold IV] 출근 경로 - 5569 (DP) (1) | 2023.02.19 |
---|---|
[Silver V] 스네이크버드 - 16435 (그리디, 정렬) : JAVA, python (0) | 2023.02.18 |
[Silver V] 색종이 - 2563 ( 구현 ) (3) | 2023.02.15 |
[Gold V] 카드게임 - 10835 (DP) (1) | 2023.02.14 |
[Gold III] 박스 채우기 - 1493 (그리디) (2) | 2023.02.12 |