반응형
package algo;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BJ_1927 {
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
MinHeap h = new MinHeap(100001);
for(int i=0; i<N; i++) {
int x = Integer.parseInt(br.readLine());
if(x == 0) {
System.out.println(h.delete());
}else { //자연수일 때는 insert 메서드에 x 더해준다
h.insert(x);
}
}
}
private static class MinHeap {
int heap[];
int size;
public MinHeap(int size) {
heap = new int[size];
}
public void insert(int x) {
heap[++size] = x; //heap[1] = x 넣어줌
for(int i=size; i>1; i/=2) {
if(heap[i/2] > heap[i]) { //새로들어온 자식이랑 부모랑 비교함
swap(i/2, i);
}else {
break;
}
}
}//insert 할 때마다 min값이 heap[1]에 들어간다.
public int delete() { //입력값이 0일때 delete 실행 결과 출력
//출력한 최소값 삭제
if(size == 0) {
return 0;
}
int root = heap[1];
heap[1] = heap[size]; //루트에 마지막 값 넣어줌 ,최소값 출력 했으니깐
size--; // 값 하나 뺐으니 사이즈도 하나 빼줌
for(int i=1; i*2<=size;) {
if(heap[i] < heap[i*2] && heap[i] < heap[i*2+1]) {//부모 노드가 왼, 오 자식 보다 작으면 바꿀 필요 없음
break;
}else if(heap[i*2] < heap[i*2+1]) { //왼이 오보다 작으면
swap(i, i*2); // 부모랑 왼이랑 바꾼다
i = i*2;
}else {
swap(i, i*2+1);
i = i*2+1;
}
}
return root;
}
public void swap(int a, int b) {
int temp = heap[a];
heap[a] = heap[b];
heap[b] = temp;
}
}
}
// https://baelanche.tistory.com/131
// https://blog.naver.com/zzang9ha/221771852840
힙 이제 완벽하게 안다^^ㅎㅎ
반응형
'백준알고리즘' 카테고리의 다른 글
백준 1914 하노이 탑 JAVA (0) | 2020.06.29 |
---|---|
백준 11403 경로 찾기 JAVA BFS (0) | 2020.06.28 |
백준 9252번 LCS 2 런타임 에러 (0) | 2020.06.03 |
백준 JAVA 11812 K진 트리 (0) | 2020.05.10 |
백준 1926 그림[BFS] (0) | 2020.04.23 |
댓글