힙 (D3)
문제 링크
- 최대힙 구현하는 문제
- Java의 경우 priorityQueue를 이용하면 구현되어 있는 method를 호출하여 사용할 수 있지만
- 배열을 이용해서 힙에 add하는 것과 remove하는 것을 구현해 보았다..!
- 배열을 순회하는 index를 주의하고, remove결과를 출력하는 string을 + 연산이 아닌 스트링빌더의 append를 사용해야 시간초과가 나오지 않는다
Solution
import java.util.Scanner;
public class Solution {
static int[] heap;
static int size;
static StringBuilder output;
public static void add(int n) {
int idx = ++size;
heap[idx] = n;
while (idx > 1) {
if (n > heap[idx / 2]) {
heap[idx] = heap[idx / 2];
idx = idx / 2;
} else {
break;
}
}
heap[idx] = n;
}
public static void remove() {
if (size < 1) {
output.append("-1 ");
return;
}
output.append(heap[1]);
output.append(" ");
int target = heap[size];
heap[size--] = 0;
int idx = 1;
while (idx*2 <= size) {
int smallIdx = (heap[idx * 2] > heap[idx * 2 + 1]) ? idx * 2 : idx * 2 + 1;
if (target < heap[smallIdx]) {
heap[idx] = heap[smallIdx];
idx = smallIdx;
} else {
break;
}
}
heap[idx] = target;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int T = sc.nextInt();
for (int t = 1; t <= T; t++) {
int N = sc.nextInt();
heap = new int[N+1];
size = 0;
output = new StringBuilder();
for (int i = 0; i < N; i++) {
switch (sc.nextInt()) {
case 1:
add(sc.nextInt());
break;
case 2:
remove();
break;
}
}
System.out.printf("#%d %s\n", t, output);
}
}
}