๐ช๐ป programmers ๊ณ ๋์ Kit - ํ(Heap)
Heap(ํ)
์ต์๊ฐ
๋๋ ์ต๋๊ฐ
์ ๋น ๋ฅด๊ฒ
์ฐพ์๋ด๊ธฐ ์ํด ์์ ์ด์งํธ๋ฆฌ
ํํ๋ก ๋ง๋ค์ด์ง ์๋ฃ๊ตฌ์กฐ
์ด๋ฏธ์ง ์ถ์ฒ : ๋ธ๋ก๊ทธ ๋งํฌ
Tree ๊ตฌ์กฐ
, ๊ฑฐ๊พธ๋ก ๋ณด๋ฉด ๋๋ฌด ๊ฐ์ด ์๊ฒจ์ ํธ๋ฆฌ๊ตฌ์กฐ๋ผ๊ณ ํ๋ค.
๋ถ๋ชจ๋ ธ๋
: ์๊ธฐ ์์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ค ์์ ๋ณด๋ค ๋์ ๋ ธ๋(B์ ๋ถ๋ชจ : A)
์์๋ ธ๋
: ์๊ธฐ ์์ ๊ณผ ์ฐ๊ฒฐ๋ ๋ ธ๋ ์ค ์์ ๋ณด๋ค ๋ฎ์ ๋ ธ๋(C์ ์์ : G)
๋ฃจํธ๋ ธ๋
: ์ผ๋ช ๋ฟ๋ฆฌ ๋ ธ๋๋ผ๊ณ ํ๋ฉฐ ๋ฃจํธ ๋ ธ๋๋ ํ๋์ ํธ๋ฆฌ์์ ํ๋๋ง ์กด์ฌํจ ->A
๋จ๋ง๋ ธ๋
: ๋ฆฌํ ๋ ธ๋๋ผ๊ณ ํ๋ฉฐ ์์ ๋ ธ๋๊ฐ ์๋ ๋ ธ๋๋ด๋ถ๋ ธ๋
: ๋จ๋ง ๋ ธ๋๊ฐ ์๋ ๋ ธ๋ํ์ ๋ ธ๋
: ๋ถ๋ชจ๊ฐ ๊ฐ์ ๋ ธ๋(H, I, J)
๊น์ด(depth)
: ํน์ ๋ ธ๋์ ๋๋ฌํ๊ธฐ ์ํด ๊ฑฐ์ฒ๊ฐ์ผ ํ๋ โ๊ฐ์ ์ ๊ฐ์โ(H์ ๊น์ด : A -> D -> H (2๊ฐ))
๋ ๋ฒจ(length)
: ํน์ ๊น์ด์ ์๋ ๋ ธ๋๋ค์ ์งํฉ์ฐจ์(degree)
: ํน์ ๋ ธ๋๊ฐ ํ์(์์) ๋ ธ๋์ ์ฐ๊ฒฐ๋ ๊ฐ์(B์ ์ฐจ์ E, F (2๊ฐ))
์ด๋ฏธ์ง ์ถ์ฒ : ๋ธ๋ก๊ทธ ๋งํฌ
์ฌ๊ธฐ์ ์์ ์ด์ง ํธ๋ฆฌ
๋ ์์ ํธ๋ฆฌ๊ตฌ์กฐ์์ ํน์ ํ ํํ๋ก ์ ํ์ ํ๋ ๊ฒ์ด๋ค.
๋ชจ๋ ๋ ธ๋์ ์ต๋ ์ฐจ์๋ฅผ 2๋ก ์ ํํ๋ค. -> ๊ฐ ๋ ธ๋๋ ์์ ๋ ธ๋๋ฅผ ์ต๋ 2๊ฐ๊น์ง๋ง ๊ฐ์ง ์ ์๋ค.
โ๋ง์ง๋ง ๋ ๋ฒจโ์ ์ ์ธํ ๋ชจ๋ ๋ ธ๋๊ฐ ์ฑ์์ ธ ์๊ณ ๋ชจ๋ ๋ ธ๋๋ ์ผ์ชฝ๋ถํฐ ์ฑ์์ ธ ์์ด์ผ ํ๋ค.
์ด๋ฏธ์ง ์ถ์ฒ : ๋ธ๋ก๊ทธ ๋งํฌ
ํฌํ ์ด์งํธ๋ฆฌ
: ๋ง์ง๋ง ๋ ๋ฒจ
์ ์ ์ธํ ๋ชจ๋ ๋
ธ๋๋ ๋ ๊ฐ์ ์์ ๋
ธ๋๋ฅผ ๊ฐ์ ธ์ผ ํ๋ค.
๊ทธ๋ ๋ค๋ฉด Heap(ํ)์ ๊ตฌํ์?
์ด๋ค ๋ฆฌ์คํธ์ ๊ฐ์ ๋ฃ๊ฑฐ๋ ๋นผ๋ ค๊ณ ํ ๋, ์ฐ์ ์์๊ฐ ๋์ ๊ฒ๋ถํฐ ๋นผ๋ด๋ ค๊ณ ํ๋ค๋ฉด ๋ณดํต ์ ๋ ฌ์ ์๊ฐํ ๊ฒ์ด๋ค. ์ซ์๊ฐ ๋ฎ์์๋ก ์ฐ์ ์์๊ฐ ๋๋ค๊ณ ๊ฐ์ ํ ๋, ๋งค๋ฒ ์ ์์๊ฐ ๋ค์ด์ฌ ๋๋ง๋ค ์ด๋ฏธ ๋ฆฌ์คํธ์ ์๋ ์์๋ค๊ณผ ๋น๊ตํ๊ณ ์ ๋ ฌํด์ผ ํ๋ค.
์ด์ ๊ฐ์ ๊ณผ์ ์ ๋นํจ์จ์ ์ด๋ค. ๋ฐ๋ผ์ ์ด์ ๊ฐ์ ์กฐ๊ฑด์ ๋ถ์ธ๋ค.
๋ถ๋ชจ๋ ธ๋๋ ํญ์ ์์๋ ธ๋๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค! ์ฆ, ๋ชจ๋ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ์ฐ์ ์์๋ฅผ ์ ํ ํ์๊ฐ ์์ด์ง๋ค. ๋ถ๋ชจ๋ ธ๋๊ฐ ํญ์ ์ฐ์ ์์๊ฐ ๋๋ค๋ ์กฐ๊ฑด๋ง ๋ง์กฑ์ํค๋ฉด์ ์์ ์ด์ง ํธ๋ฆฌ ํํ๋ก ์ฑ์๋๊ฐ๋ฉด ๋๋ค.
์ด๋ฏธ์ง ์ถ์ฒ : ๋ธ๋ก๊ทธ ๋งํฌ
๊ทธ๋ ๋ค๋ฉด ๋ฃจํธ ๋
ธ๋(์ฌ๊ธฐ์ 1
)๋ ํญ์ ์ฐ์ ์์๊ฐ ๋์ ๋
ธ๋์ด๋ค. ์ด๋ฌํ ์๋ฆฌ๋ก ์ต๋๊ฐ์ด๋ ์ต์๊ฐ์ ๋น ๋ฅด๊ฒ ์ฐพ์๋ผ ์ ์๋ค๋ ์ฅ์ (์๊ฐ ๋ณต์ก๋: O(1)
)๊ณผ ํจ๊ป ์ฝ์
, ์ญ์ , ์ฐ์ฐ์์๋ ๋ถ๋ชจ๋
ธ๋๊ฐ ์์๋
ธ๋๋ณด๋ค ์ฐ์ ์์๋ง ๋์ผ๋ฉด ๋๋ฏ๋ก ๊ฒฐ๊ตญ ํธ๋ฆฌ์ ๊น์ด๋งํผ๋ง ๋น๊ต๋ฅผ ํ๋ฉด ๋๊ธฐ ๋๋ฌธ์ O(logN)
์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
์ถ๊ฐ๋ก ๋ถ๋ชจ๋ ธ๋์ ์์๋ ธ๋์ ๊ด๊ณ๋ง ์ ๊ฒฝ์ฐ๋ฉด ๋๊ธฐ ๋๋ฌธ์ ํ์ ๊ฐ ์ฐ์ ์์๋ ๊ณ ๋ ค๋์ง ์๋๋ค. ์ด๋ฌํ ์ ๋ ฌ ์ํ๋ฅผ โ๋ฐ์ ๋ ฌ ์ํโ, โ๋์จํ ์ ๋ ฌ ์ํโ, โ์ฝํ ํโ์ด๋ผ๊ณ ํ๋ค.
์ต์ ํ : ๋ถ๋ชจ ๋ ธ๋ ๊ฐ(key ๊ฐ) <= ์์ ๋ ธ๋ ๊ฐ(key ๊ฐ)
์ต๋ ํ : ๋ถ๋ชจ ๋ ธ๋ ๊ฐ(key ๊ฐ) >= ์์ ๋ ธ๋ ๊ฐ(key ๊ฐ)
๐ ์ฑ์ง
- ์ผ์ชฝ ์์ ๋ ธ๋์ ์ธ๋ฑ์ค = ๋ถ๋ชจ ๋ ธ๋์ ์ธ๋ฑ์ค * 2
- ์ค๋ฅธ์ชฝ ์์ ๋ ธ๋์ ์ธ๋ฑ์ค = ๋ถ๋ชจ ๋ ธ๋์ ์ธ๋ฑ์ค * 2 + 1
- ๋ถ๋ชจ ๋ ธ๋์ ์ธ๋ฑ์ค = ์์ ๋ ธ๋์ ์ธ๋ฑ์ค / 2
Heap(ํ) ๊ตฌํ
๋ฐฐ์ด๋ก ๊ตฌํ
์ธ๋ฑ์ค 0์ ์ฌ์ฉํ์ง ์์
๋ถ๋ชจ-์์ ์ฌ์ด ์ธ๋ฑ์ค ๊ด๊ณ
์ธ๋ฑ์ค
i
์์ ๋ถ๋ชจ ์ธ๋ฑ์ค :i / 2
์ธ๋ฑ์ค
i
์์ ์ข์ธก ์ธ๋ฑ์ค :i * 2
์ธ๋ฑ์ค
i
์์ ์ฐ์ธก ์ธ๋ฑ์ค :(i * 2) + 1
์ต๋ ํ์ผ๋ก ๊ฐ์
์ฝ์ ์ฐ์ฐ
๋ง์ง๋ง ์์น์ ๋ ธ๋ ๋ง๋ค์ด์ ์ฝ์
๋ถ๋ชจ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ์์ผ๋ฉด ๋
๋ถ๋ชจ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ํฌ๋ฉด ๋ถ๋ชจ ๋ ธ๋์ ์ค์์น
2~3๋ฒ ๊ณผ์ ์ต๋ ๋ฃจํธ๊น์ง ๋ฐ๋ณต
- ์๋ก์ด ๋ ธ๋ 9 ์ฝ์
- ๋ถ๋ชจ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ํฌ๋ฏ๋ก ๋ถ๋ชจ ๋ ธ๋์ ์ค์์น
์ญ์ ์ฐ์ฐ
๋ฃจํธ ๋ ธ๋ ๊ฐ ์ ๊ฑฐ
๋ง์ง๋ง ๋ ธ๋ ๊ฐ ๋ฃจํธ๋ก ์ฎ๊ธฐ๊ณ ๋ ธ๋ ์ญ์
3-1. ์์ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ํฌ๋ฉด ๋
3-2. ์์ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ์์ผ๋ฉด ์ค์์น
- 3๋ฒ ๊ณผ์ ์ต๋ ๋ฆฌํ๊น์ง ๋ฐ๋ณต
- ๋ฃจํธ ๋ ธ๋ ๊ฐ 10 ์ ๊ฑฐ
- ๋ง์ง๋ง ๋ ธ๋ ๊ฐ ๋ฃจํธ๋ก ์ฎ๊ธฐ๊ณ ๋ ธ๋ ์ญ์
- ์์ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ์์ผ๋ฏ๋ก ์ค์์น
- ์์ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ์์ผ๋ฏ๋ก ์ค์์น
์๋ฐ์์ ์ฐ์ ์์ ํ
์ ์ธ
new PriorityQueue<[type]>()
PriorityQueue<Integer> pq = new PriorityQueue<>();
// ์ค๋ฆ์ฐจ์PriorityQueue<Integer> pq = new PriorityQueue<Integer>(Collections.reverseOrder());
// ๋ด๋ฆผ์ฐจ์
์ฝ์
add(E element)
: ํ ๊ณต๊ฐ์ด ์์ด์ ์ฝ์ ์คํจ ์exception
offer(E element)
: ํ ๊ณต๊ฐ์ด ์์ด์ ์ฝ์ ์คํจ ์null
๋ฐํ
์ญ์
poll()
:front
์ ์์นํ ์์ ์ ๊ฑฐ ํ ๋ฐํ, ํ ๋น์๋ค๋ฉดnull
๋ฐํremove()
:front
์ ์์นํ ์์ ์ ๊ฑฐ ํ ๋ฐํ, ํ ๋น์๋ค๋ฉดexception
pq.removeIf(n -> (n % 2 == 0));
pq : [1, 2, 3, 4, 5] -> pq : [1, 3, 5]
remove(E element)
: ํน์ ์์ ์ ๊ฑฐ, ์ญ์ ํ๋ ค๋ ์์ ํ์ ์์ผ๋ฉดfalse
๋ฐํremoveAll(collection<?>)
: ํ๋ผ๋ฏธํฐ๋ก ์ค ์ปฌ๋ ์ ์ ๊ฒน์น๋ ์์๋ฅผ ์ ๊ฑฐ
์ ๊ทผ
peek()
: ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ ๋ฐํ, ํ ๋น์ด์๋ค๋ฉด null ๋ฐํiterator()
: ๋ฐ์ดํฐ ์ง์ฐ์ง ์๊ณ ์ํํ ๊ฒฝ์ฐ ์ฌ์ฉ
1
2
3
4
5
6
7
8
//pq : [1, 3, 2]
Iterator<Integer> iter = pq.Iterator();
while(iter.hasNext()) {
Integer i = iter.next();
System.out.Print(i + " ");
}
// ์ถ๋ ฅ : 1 3 2
๊ธฐํ
size()
: ์ฌ์ด์ฆtoArray()
: ํ์ ์ ์ฅ๋ ๋ฐ์ดํฐ ๋ฐฐ์ด๋ก ๊ฐ์ ธ์ด
๋ ๋งต๊ฒ - ํ๋ก๊ทธ๋๋จธ์ค
์ฐ์ ์์ ํ์์ poll์ 2๋ฒํ๋ฉด ์ฒซ ๋ฒ์งธ ๊ฐ์ ๊ฐ์ฅ ์์ ๊ฐ, ๊ทธ ๋ค์์ ๋ ๋ฒ์งธ๋ก ์์ ๊ฐ์ด ๋๋ค. ์ด ๋ ์๋ฅผ ๊ณ์ฐํ์ฌ ๋ค์ ์ฐ์ ์์ ํ์ ๋ฃ์ผ๋ฉด ๋๋ค.
์ด ๊ตฌ์กฐ์์ ๊ฐ์ฅ ์์ ์๊ฐ K๋ฅผ ๋์ง ์์ผ๋ฉด ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ๊ฐ์ ๊ตฌํ๋ฉด ๋๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.util.*;
class Solution {
public int solution(int[] scoville, int K) {
int answer = 0;
PriorityQueue<Integer> pq = new PriorityQueue<>();
for(int scovilles : scoville)
{
pq.offer(scovilles);
}
while(pq.size() > 1 && pq.peek() < K)
{
int fir = pq.poll();
int sec = pq.poll();
int total = fir + (sec * 2);
pq.add(total);
answer++;
}
if(pq.peek() < K && pq.size() <= 1)
{
return -1;
}
return answer;
}
}
๋์คํฌ ์ปจํธ๋กค๋ฌ - ํ๋ก๊ทธ๋๋จธ์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.util.*;
class Solution {
public int solution(int[][] jobs) {
int answer = 0; // ์ด ๋๊ธฐ์๊ฐ์ ํฉ์ ์ ์ฅ
int time = 0; // ํ์ฌ ์๊ฐ
int idx = 0; // ํ์ฌ ์ฒ๋ฆฌ ์ค์ธ ์์
์ ์ธ๋ฑ์ค
int len = jobs.length; // ์์
์ ๊ฐ์
Arrays.sort(jobs, (o1,o2) -> (o1[0]-o2[0])); // ์์ฒญ ์๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ
PriorityQueue<int[]> pq = new PriorityQueue<>((o1,o2)-> o1[1]-o2[1]); // ์์ ์๊ฐ์ด ์งง์ ์์
๋ถํฐ ์ฒ๋ฆฌ
while(!pq.isEmpty() || idx < len) // ํ๊ฐ ๋น์ด์์ง ์๊ฑฐ๋ ์ฒ๋ฆฌํด์ผ ํ ์์
์ด ๋จ์ ์์ ๋๊น์ง
{
while(idx < len && jobs[idx][0] <= time) // ํ์ฌ ์๊ฐ๋ณด๋ค ์์ฒญ ์๊ฐ์ด ์๊ฑฐ๋ ๊ฐ์ ์์
์ ์ฐ์ ์์ ํ์ ์ถ๊ฐ
{
pq.offer(jobs[idx++]); // ์์
์ ํ์ ๋ฃ๊ณ idx 1 ์ฆ๊ฐ
}
if(pq.isEmpty()) // ํ๊ฐ ๋น์๋ค๋ฉด ๋ค์ ์์
์ด ์์ฒญ๋ ์์ ์ผ๋ก ์๊ฐ ์ด๋
{
time = jobs[idx][0];
}
else{
int[] job = pq.poll();
time += job[1];
answer += time - job[0];
}
}
return answer / len;
}
}
์ด์ค์ฐ์ ์์ํ - ํ๋ก๊ทธ๋๋จธ์ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import java.util.*;
class Solution {
public int[] solution(String[] operations) {
int[] answer = {0,0};
PriorityQueue<Integer> max = new PriorityQueue<Integer>(Collections.reverseOrder());
PriorityQueue<Integer> min = new PriorityQueue<Integer>();
for(int i=0;i<operations.length;i++)
{
String[] str = operations[i].split(" ");
int num = Integer.valueOf(str[1]);
if(str[0].equals("I"))
{
max.offer(num);
min.offer(num);
}
else if(str[0].equals("D") && num == 1 && !max.isEmpty())
{
min.remove(max.poll());
}
else if(str[0].equals("D") && num == -1 && !min.isEmpty())
{
max.remove(min.poll());
}
}
if(!min.isEmpty() && !max.isEmpty())
{
answer[0] = max.peek();
answer[1] = min.peek();
}
return answer;
}
}
์ฐธ๊ณ ๐๐ปโโ๏ธ
๋ธ๋ก๊ทธ - https://st-lab.tistory.com/205
๋ธ๋ก๊ทธ - https://velog.io/@suk13574/์๋ฃ๊ตฌ์กฐJava-ํheap