[ Baekjoon Online Judge _ 11279 _ 최대 힙 ]
문제
널리 잘 알려진 자료구조 중 최대 힙이라는 것이 있다. 최대 힙을 이용하여 다음과 같은 연산을 지원하는 프로그램을 작성하시오.
- 배열에 자연수 x를 넣는다.
- 배열에서 가장 큰 값을 출력하고, 그 값을 배열에서 제거한다.
프로그램은 처음에 비어있는 배열에서 시작하게 된다.
입력
첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이라면 배열에서 가장 큰 값을 출력하고 그 값을 배열에서 제거하는 경우이다. 입력되는 자연수는 2^31보다 작다.
출력
입력에서 0이 주어진 회수만큼 답을 출력한다. 만약 배열이 비어 있는 경우인데 가장 큰 값을 출력하라고 한 경우에는 0을 출력하면 된다.
예제 입력
13
0
1
2
0
0
3
2
1
0
0
0
0
0
예제 출력
0
2
1
3
2
1
0
0
풀이
최대힙 문제.
배열을 사용해서 힙을 표현했다.
이것 역시 혼자 힘으로는 못풀었고.. 참고자료를 보고 풀었다!
insert 는 힙의 맨 마지막원소부터 비교해가며 item의 자리를 찾고
delete 는 먼저 root 위치의 원소를 삭제(반환?)하고
그 위치에 힙의 맨 마지막원소를 넣고
그 원소를 자식노드와 비교해가며 자리를 찾는다.
delete 가 좀 복잡해서 이해하기 힘들었다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | public class Heap { int[] maxHeap = new int[1000]; int num = 0; //총 원소갯수 void insert(int item){ int i = ++num; //루트가아니면 && item이 더 크면 while( i != 1 && item > maxHeap[i]){ maxHeap[i] = maxHeap[i/2]; i = i/2; } maxHeap[i] = item; } int delete(){ if(num == 0) return 0; int max = maxHeap[1]; int temp = maxHeap[num--], parent = 1, child = 2; //temp : 맨마지막원소 while(child <= num){ // if(child < num && maxHeap[child] < maxHeap[child+1]) child++; if(temp >= maxHeap[child]) break; maxHeap[parent] = maxHeap[child]; parent = child; child = child*2; } maxHeap[parent] = temp; return max; } } | cs |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); Heap maxHeap = new Heap(); int N = sc.nextInt(); int X; while(N-- > 0){ X = sc.nextInt(); if(X == 0){ System.out.println(maxHeap.delete()); } else{ maxHeap.insert(X); } } } } | cs |
'Algorithm > Java' 카테고리의 다른 글
Baekjoon Online Judge _ 01389 _ 케빈 베이컨의 6단계 법칙 (2) | 2016.11.24 |
---|---|
Baekjoon Online Judge _ 01149 _ RGB 거리 (0) | 2016.11.21 |
Baekjoon Online Judge _ 11403 _ 경로 찾기 (2) | 2016.11.20 |
정렬 - 삽입, 퀵, 합병 (Insertion, Quick, Merge) (2) | 2016.11.11 |
Baekjoon Online Judge _ 01620 _ 나는야 포켓몬 마스터 이다솜 (1) | 2016.11.05 |