반응형
문제 설명
 

1927번: 최소 힙

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

www.acmicpc.net

  • N개의 수가 주어짐
  • 정수 x에 따라
    • 0이 아니면 : 정수 x를 배열에 저장
    • 0이면 : 배열에 저장된 값 중 제일 작은 값 출력. 배열에 값이 없다면 0 출력.

 

 

문제 풀이

트리

원소들을 계층적으로 저장하는 비선형 자료구조

 

이진트리

하나의 노드가 최대 2개의 자식노드를 가지는 트리구조

 

[DS] 이진 트리 - binary tree (개념 및 이진 트리의 종류)

트리 Tree 는 원소들을 계층적으로 저장하는 비선형 non-linear 자료구조입니다. * 위 그림의 나무를 뒤집어 둔 것과 비슷하게 생겼습니다. 최상의 원소 루트 root를 제외한 각각의 원소는 하나의 부

sean-ma.tistory.com

그 중 부모 자식간의 대소관계는 정해져 있으면서, 형제간의 대소관계가 정해지지 않은 트리구조가 이다.

 

자식노드 = 부모노드 * 2, 부모노드 * 2 +1

 

부모노드 = 자식노드 / 2

 

최소 힙

push : 배열의 제일 마지막에 값을 넣고, 그 부모와 비교해 부모보다 작은 값이면 자리를 바꾸면서 정렬.

pop : 배열의 가장 앞자리(1)을 빼고, 가장 마지막 위치의 값을 맨 앞자리에 넣는다. 그리고 그 자식노드들과 비교해 더 큰 값이면 자리를 바꾸면서 정렬한다. 

 

문제 풀이 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class _1927_최소힙 {
	static int heap[], size = 0;

	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		int N = Integer.parseInt(in.readLine());
		heap = new int[N];
		for (int i = 0; i < N; ++i) {	//num 값에 따라 배열에서 값을 꺼낼지 넣을지 결정
			int num = Integer.parseInt(in.readLine());
			if(num == 0) {
				System.out.println(pop());
			}else {
				push(num);
			}
		}
	}
	
	static void push(int num) {
		int idx = ++size;
		while((idx != 1) && (num<heap[idx/2])) {	//자식보다 작은 값이면 앞쪽으로 자리 바꾸기
			heap[idx/2] ^= heap[idx];
			heap[idx] ^= heap[idx/2];
			heap[idx/2] ^= heap[idx];
			idx /= 2;
		}
		heap[idx] = num;
	}
	
	static int pop() {
		if(size == 0) {
			return 0;
		}
		int result = heap[1];	//제일 앞의 값 꺼내기(제일 작은 것)
		heap[1] = heap[size--];
		int parent = 1;
		int child;
		while(true) {
			child = parent*2;
			if(child+1 <= size && heap[child] > heap[child+1]) {	//더 작은 자식 노드 찾기
				child++;
			}
			if(child>size || heap[child] > heap[parent]) {	//범위 밖이거나 자식보다 작은 값이면 나가기
				break;
			}
            //자리 바꾸기
			heap[child] ^= heap[parent];
			heap[parent] ^= heap[child];
			heap[child] ^= heap[parent];
			parent = child;
		}
		return result;
	}
}

 

반응형

'알고리즘 문제풀이 > 백준' 카테고리의 다른 글

Baekjoon_5430_AC  (0) 2021.06.16
Baekjoon_9251_LCS  (0) 2021.04.21
Baekjoon_1920_수찾기  (0) 2021.02.25
Baekjoon_20061_모노미노도미노2  (0) 2021.02.22
Baekjoon_3019_테트리스  (0) 2021.01.25