반응형
문제 설명
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 |