π©π» Heap μ΄λ?
λΉμ ν μλ£κ΅¬μ‘°λ‘ νΈλ¦¬ κΈ°λ°μ μλ£κ΅¬μ‘°μ΄λ€. μ΅λ ν(Max Heap), μ΅μ ν(Min Heap)μ΄ μλ€.
μ΅λ νμμλ λΆλͺ¨ λ Έλκ° μμ λ Έλλ³΄λ€ ν¬κ±°λ κ°κ³ , μ΅μ νμμλ λΆλͺ¨ λ Έλκ° μμ λ Έλλ³΄λ€ μκ±°λ κ°λ€.
Heapμ μμ μ΄μ§ νΈλ¦¬(Complete Binary Tree) κΈ°λ°μΌλ‘ λ§λ€μ΄μ‘μΌλ©° μ΄μ§ ν(Binary Heap)μ κ°μ₯ μΌλ°μ μΈ ννμ΄λ€.
μ°μ μμ νλ₯Ό μνμ¬ λ§λ€μ΄μ‘μΌλ―λ‘ μ°μ μμ νλ₯Ό ꡬνν λ μ¬μ©λλ©° μ΅λκ°μ΄λ μ΅μκ°μ λΉ λ₯΄κ² μ°Ύμ μ μλ€.
νμ μΌμ’ μ λ° μ λ ¬ μνλ₯Ό μ μ§νλ€.(ν° κ°μ΄ μμ λ 벨μ μκ±°λ μμ κ°μ΄ νμ λ 벨μ μλ€. )
λν ν νΈλ¦¬μμλ μ€λ³΅λ κ°μ νμ©νλ€. (μ΄μ§ νμ νΈλ¦¬μμλ μ€λ³΅λ κ°μ νμ©νμ§ μλλ€.)
μ¦, νμ μ΅λν or μ΅μνμ μ΄μ©νμ¬ μ΅λκ° or μ΅μκ°μ μ°Ύλλ° μ 리νλ©° μλμ κ°μ νΉμ§μ κ°λλ€.
- μμ μ΄μ§ νΈλ¦¬ νν
- μ€λ³΅ κ° νμ©
- λ° μ λ ¬ μν
* Treeμ λν μ λ¦¬κΈ : https://sohyun119.tistory.com/32
βοΈ μκ° λ³΅μ‘λ
μ½μ μμ : O(logn) (λ§€μ° ν¨μ¨μ μΈ νΈμ΄λ€)
μ΅λκ° or μ΅μκ°μ μ°Ύλ μκ° : O(1) (μλνλ©΄ λ£¨νΈ λ Έλκ° μ΅λ or μ΅μλ₯Ό κ°μ§λ―λ‘)
λ°λΌμ νμ μ°μ μμ ν μ΄μΈμλ μ΅λ, μ΅μκ°μ μ°Ύκ±°λ μ λ ¬ν λμ λ§μ΄ μ¬μ©λλ€.
βοΈ ν(heap)μ μ’ λ₯
1. μ΅λν (Max heap)
- λΆλͺ¨ λ Έλμ ν€ κ°μ΄ μμ λ Έλμ ν€ κ°λ³΄λ€ ν¬κ±°λ κ°μ μμ μ΄μ§ νΈλ¦¬
- key(λΆλͺ¨ λ Έλ) >= key(μμ λ Έλ)
2. μ΅μν (Min heap)
- λΆλͺ¨ λ Έλμ ν€ κ°μ΄ μμ λ Έλμ ν€ κ°λ³΄λ€ μκ±°λ κ°μ μμ μ΄μ§ νΈλ¦¬
- key(λΆλͺ¨ λ Έλ) <= key(μμ λ Έλ)
βοΈ ν(heap)μ ꡬν
- νμ μ μ₯νλ νμ€μ μΈ μλ£κ΅¬μ‘°λ λ°°μ΄μ΄λ€.
- ꡬνμ μ½κ² νκΈ° μν΄ λ°°μ΄μ 첫 λ²μ§Έ indexμΈ 0μ μ¬μ©λμ§ μλλ€.
- νΉμ μμΉμ λ Έλ λ²νΈλ μλ‘μ΄ λ Έλκ° μΆκ°λμ΄λ λ³νμ§ μλλ€.
- νμμμ λΆλͺ¨λ Έλμ μμλ Έλ κ°μ κ΄κ³
- μΌμͺ½ μμμ index = (λΆλͺ¨μ index) * 2
- μ€λ₯Έμͺ½ μμμ index = (λΆλͺ¨μ index) * 2 + 1
- λΆλͺ¨μ index = (μμμ index) / 2
βοΈ κ΄λ ¨ λ¬Έμ νμ΄
1. λ°±μ€ 24174λ² : ν μ λ ¬2
μ΄λ² λ¬Έμ λ λ무 μ€λκ±Έλ¦¬κ³ μ΄λ €μ λ€γ γ 보기μ μ£Όμ΄μ§ μ½λλ λ€λ₯΄κ² μ½λλ₯Ό μ²μλΆν°μ§°λ€κ° ν μ€νΈ μ½λλ λ§μΌλ... μ±μ κ²°κ³Όκ° κ³μ νλ €μ μ°¨κ·Όμ°¨κ·Ό λ¬Έμ μ μ£Όμ΄μ§ μ½λνμ μ΄μ©νμ¬ λ€μ νμ΄λ³΄μλ€...
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
class Solution{
int count = 0;
int k;
int[] arr;
public Solution(int[] arr, int k){
this.arr = arr;
this.k = k;
}
public String solution(){
try{
heapSort(arr);
}catch (Exception e){
return toString();
}
return "-1";
}
public void heapSort(int[] arr){
int n = arr.length -1;
buildMinHeap(arr, n);
for(int i=n; i>=2; i--){
swap(arr,1,i);
heapify(arr, 1, i-1);
}
}
public void buildMinHeap(int[] arr, int n){
for(int i=n/2; i>=1; i--){
heapify(arr, i, n);
}
}
// arr[node]λ₯Ό 루νΈλ‘ νλ νΈλ¦¬λ₯Ό μ΅μ ν μ±μ§μ λ§μ‘±νλλ‘ μμ νλ€.
// arr[node]μ λ μμμ 루νΈλ‘ νλ μλΈ νΈλ¦¬λ μ΅μ ν μ±μ§μ λ§μ‘±νκ³ μλ€.
// nμ λ°°μ΄ arrμ μ 체 ν¬κΈ°μ΄λ©° μ΅λ μΈλ±μ€λ₯Ό λνλΈλ€.
public void heapify(int[] arr, int node, int n){
int smaller = 0;
int left = 2 * node;
int right = 2 * node + 1;
if(right <= n){
if(arr[left] < arr[right]){
smaller = left;
}else{
smaller = right;
}
} else if (left <= n) {
smaller = left;
} else{
return;
}
// μ΅μ ν μ±μ§μ λ§μ‘±νμ§ λͺ»νλ κ²½μ° μ¬κ·μ μΌλ‘ μμ
if(arr[smaller] < arr[node]){
swap(arr, smaller, node);
// smallerκ° λ£¨νΈλ
Έλκ° λμ΄ μ¬κ·ν¨μ μ€ν
heapify(arr, smaller, n);
}
}
public void swap(int[] arr, int i, int j){
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
if(++count == k){
throw new RuntimeException(); //
}
}
public String toString(){
StringBuilder sb = new StringBuilder();
for(int i=1; i<arr.length; i++){
sb.append(arr[i]).append(" ");
}
return sb.toString();
}
}
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int k = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int[] arr = new int[n + 1];
arr[0] = 0;
for (int i = 1; i <= n; i++) {
arr[i] = Integer.parseInt(st.nextToken(" "));
}
System.out.println(new Solution(arr, k).solution());
}
}
-> λ ΈνΈμ μ 리ν΄μ λ€μ 곡λΆ..
'μκ³ λ¦¬μ¦ > μλ£κ΅¬μ‘° μ΄λ‘ ' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
java - λΉνΈ μ°μ°μ (0) | 2024.06.26 |
---|---|
μλ£κ΅¬μ‘° λͺ©λ‘ (+javaμμμ μ¬μ©) (0) | 2024.06.25 |
νΈλ¦¬(Tree) - λΉμ ν μλ£κ΅¬μ‘° (0) | 2024.06.22 |
Linked List - μλ£κ΅¬μ‘° (0) | 2024.06.21 |
HashMap - μλ£κ΅¬μ‘° (0) | 2024.06.20 |