[SW Expert Academy, SWEA 2930] 힙 (java)
Problem Solving/SWEA

[SW Expert Academy, SWEA 2930] 힙 (java)

728x90

https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV-Tj7ya3jYDFAXr&categoryId=AV-Tj7ya3jYDFAXr&categoryType=CODE&problemTitle=2930&orderBy=FIRST_REG_DATETIME&selectCodeLang=ALL&select-1=&pageSize=10&pageIndex=1

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

swexpertacademy.com


※ SW Expert 아카데미의 문제를 무단 복제하는 것을 금지합니다.

728x90

힙 직접 구현

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Solution {
	
	static int[] heap;
	static int size;
	
	private static void insert(int x) {
		// 1. 배열의 가장 맨 뒤에 삽입 (root는 1부터 시작)
		heap[++size] = x;
		
		// 2. 부모를 확인하며 부모가 자신보다 작다면 바꿔줌
		int now = size;
		while(now > 1) {
			int parent = now / 2; // 부모의 위치
			if(heap[parent] < heap[now]) { // 부모가 자신보다 작다면
				int tmp = heap[parent]; // 서로 위치 바꿔줌
				heap[parent] = heap[now];
				heap[now] = tmp;
				now = parent; // 다음 부모 확인하러
			}
			else break; // 부모가 자신보다 크거나 같으면 더 이상 확인해주지 않아도 됨
		}
	}
	
	private static int delete() {
		// 루트 노드 값 저장
		if(size == 0) return -1;
		int ret = heap[1];
		
		// 루트 값 바꿔줌
		// 1. 가장 마지막 원소를 노드에 저장
		heap[1] = heap[size];
		heap[size--] = 0;
		// 2. 루트 노드를 자식과 비교하며 자신보다 큰 값이 있을 때 바꿔줌
		int now = 1;
		int left = 2;
		int right = 3;
		while(now < size) {
			// 왼쪽, 오른쪽 중 더 큰 자식과 자리를 바꿈
			if(heap[left] > heap[right]) { // 왼쪽이 더 큰 경우
				// 현재 노드가 더 크다면 while문 탈출
				if(heap[left] <= heap[now]) break;
				int tmp = heap[now]; // 서로 위치 바꿔줌
				heap[now] = heap[left];
				heap[left] = tmp;
				
				now = left;
			}
			else { // 오른쪽이 더 큰 경우
				// 현재 노드가 더 크다면 while문 탈출
				if(heap[right] <= heap[now]) break;
				int tmp = heap[now]; // 서로 위치 바꿔줌
				heap[now] = heap[right];
				heap[right] = tmp;
				
				now = right;
			}
			
			left = now * 2;
			right = left + 1;
		}
		
		return ret;
	}

	public static void main(String[] args) throws Exception{

		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st;
		StringBuilder sb = new StringBuilder();
		
		int T = Integer.parseInt(br.readLine());
		for (int tc = 1; tc <= T; tc++) {
			sb.append("#" + tc + " ");
			
			int N = Integer.parseInt(br.readLine());
			
			// heap 초기화
			heap = new int[200003];
			size = 0;
			
			// 연산 시작
			for (int i = 0; i < N; i++) {
				st = new StringTokenizer(br.readLine());
				int c = Integer.parseInt(st.nextToken());
				
				if(c == 1) { // 추가
					int x = Integer.parseInt(st.nextToken());
					insert(x);
				}
				else { // 조회, 삭제
					sb.append(delete() + " ");
				}
			}
			sb.append("\n");
			
		}
		
		System.out.println(sb);
	}

}
728x90