Hello, Freakin world!

[백준 11279번] 최대 힙 본문

알고리즘/PS

[백준 11279번] 최대 힙

johnna_endure 2020. 9. 16. 15:31

www.acmicpc.net/problem/11279

 

11279번: 최대 힙

첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 자연수라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0이�

www.acmicpc.net

 

 

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/*
백준 11279번 - 최대 힙
https://www.acmicpc.net/problem/11279
 */
public class Main {
	static int n;
	static List<Long> heap = new ArrayList<>();
	public static void main(String[] args) throws IOException {
		InputReader reader = new InputReader();
//		InputReader reader = new InputReader("testcase.txt");
		n = reader.readInt();
		StringBuilder sb = new StringBuilder();
		for (int i = 0; i < n; i++) {
			long query = reader.readLong();
			if(query != 0) {
				add(query);
			}else {
				sb.append(pop() + "\n");
			}
		}
		sb.deleteCharAt(sb.length()-1);
		System.out.println(sb.toString());
	}

	private static void add(long n) {
		heap.add(n);
		int node = heap.size()-1;
		int parent = (node-1)/2;
		while(true) {
			//종결 조건
			if(node == 0) break;
			if(heap.get(node) < heap.get(parent)) break;
			swap(parent, node);
			node = parent;
			parent = (node-1)/2;
		}
	}

	private static long pop() {
		if(heap.size() == 0) return 0;
		if(heap.size() == 1) return heap.remove(0);

		long last = heap.remove(heap.size()-1);
		long max = heap.get(0);
		heap.set(0, last);
		int node = 0;
		while(true) {
			int left = 2*node+1; int right = 2*node+2;
			//종결 조건
			if(left >= heap.size()) break; //자식 노드가 없는 경우(리프노드)

			int next = node;
			if(heap.get(left) > heap.get(node)) next = left;
			if(right < heap.size() && heap.get(right) > heap.get(node)
					&& heap.get(right) > heap.get(left)) next = right;

			if(next == node) break;

			swap(node, next);
			node = next;
		}
		return max;
	}

	private static void swap(int a, int b) {
		long temp = heap.get(a);
		heap.set(a, heap.get(b));
		heap.set(b, temp);
	}


}

class InputReader {
	private BufferedReader br;

	public InputReader() {
		br = new BufferedReader(new InputStreamReader(System.in));
	}

	public InputReader(String filepath) {
		try {
			br = new BufferedReader(new FileReader(filepath));
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	}

	public String readLine() throws IOException {
		return br.readLine();
	}
	public int readInt() throws IOException {
		return Integer.parseInt(readLine());
	}
	public Long readLong() throws IOException {
		return Long.parseLong(readLine());
	}
}

'알고리즘 > PS' 카테고리의 다른 글

[백준 1764번] 듣보잡  (0) 2020.09.16
[백준 2583번] 영역 구하기  (0) 2020.09.16
[백준 1927번] 최소 힙  (0) 2020.09.16
[백준 14499번] 주사위 굴리기  (0) 2020.09.15
[백준 14889번] 스타트와 링크  (0) 2020.09.15
Comments