์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |
- ํ๋ก ํธ์๋
- Gatsby
- CSS
- useRef
- REACT
- ํ๋ก๊ทธ๋๋จธ์ค
- ๋ฐ๋ธ์ฝ์ค3๊ธฐ
- ์๊ณ ๋ฆฌ์ฆ
- position
- float
- ๋ธ๋ก๊ทธ
- ์๋ฐ์คํฌ๋ฆฝํธ
- Props
- useEffect
- ๋ฐ๋ธ์ฝ์ค
- fetch API
- history api
- Flex
- ์ฝ๋ฉํ ์คํธ
- Today
- Total
Daehyunii's Dev-blog
18 ์ด์ง ํ ๋ณธ๋ฌธ
18.1 ์ด์ง ํ
์ด์ง ํ์ ์ด์ง ๊ฒ์ ํธ๋ฆฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก ํธ๋ฆฌ์ ํ ์ข ๋ฅ์ด๋ค. ๊ทธ๋ฌ๋ฏ๋ก ํธ๋ฆฌ์ ์ ์ฉ๋๋ ๊ท์น๋ค์ด ๋ค ๋์ผํ๊ฒ ์ ์ฉ๋์ง๋ง ์ถ๊ฐ์ ์ผ๋ก ์ ์ฉ๋๋ ๊ท์น๋ค์ด ์๋ค. ํ์๋ ์ฌ๋ฌ๊ฐ์ง ์ข ๋ฅ๊ฐ ์์ง๋ง ์ง๊ธ ์์ ๋ณผ ๋ด์ฉ์ ํ์ ํ ์ข ๋ฅ์ธ ์ด์ง ํ์ด๋ค. ์ด์ง ํ์ ๋ค์ ์ต์ ํ๊ณผ, ์ต๋ ํ์ผ๋ก ๊ตฌ๋ถ๋๋ค.
์ต๋ ์ด์ง ํ์์๋ ๋ถ๋ชจ ๋ ธ๋๊ฐ ํญ์ ์์ ๋ ธ๋๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ง๋ค. ์์ ๋ ธ๋๋ก ์ ์ฅ๋๋ ์ผ์ชฝ/์ค๋ฅธ์ชฝ์ ์์๋ ์๊ด์์ด ํ ๋ ๋ฒจ ์๋์ ์๋ ์ฆ, ์์ ๋ ธ๋๋ณด๋ค๋ ํญ์ ๋ถ๋ชจ ๋ ธ๋๊ฐ ํฌ๋ค.(์ค๋ฅธ์ชฝ/์ผ์ชฝ ์์๋ ์ค์ํ์ง ์๊ณ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ์ผ์ชฝ๋ถํฐ ๊ฐ์ด ์ ์ฅ๋๋ค.)
์ต์ ์ด์ง ํ์ ์ต๋ ์ด์ง ํ๊ณผ ๋ฐ๋๋ก ๋ถ๋ชจ ๋ ธ๋๋ ํญ์ ์์ ๋ ธ๋๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ง๋ค. ์์ ๋ ธ๋๋ก ์ ์ฅ๋๋ ์ผ์ชฝ/์ค๋ฅธ์ชฝ์ ์์๋ ๋ง์ฐฌ๊ฐ์ง๋ก ์ค์ํ์ง ์๋ค.
์ด์ง ํ์ ์ด์ง ๊ฒ์ ํธ๋ฆฌ์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ ๋ ธ๋๋ ์ธ์ ๋ ์ต๋ ๋ ๊ฐ์ ์์ ๋ ธ๋๋ฅผ ๊ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด์ง ํ์ ์ธ์ ๋ ์ต์ ์ ์ฉ๋์ ๊ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ถ๋ชจ ๋ ธ๋์ ์์ ๋ ธ๋๊ฐ ์ฐ๊ฒฐ ๋ ๋์๋ ์ธ์ ๋ ์ผ์ชฝ ์์์ด ๋จผ์ ์ฑ์์ง๋ค. ์ฆ, ์๋น๋ง ๊ด๊ณ์ ์๋ ๋ ธ๋๋ค ์ฌ์ด์์๋ ํน๋ณํ ์์๊ฐ ์๋ค.
18.2 ํ ์ ๋ ฌ
์ด์ง ํ์ ๊ตฌํ์ ๋ณดํต ๋ฐฐ์ด์ ์์๋ค์ ํธ๋ฆฌ ๊ตฌ์กฐ์ ๋ง๊ฒ ์์น์์ผ ๊ตฌํํ๊ฒ ๋๋ค.
/* ์ต๋ ์ด์ง ํ์ ๊ตฌ์ฑ
๋ถ๋ชจ ๋
ธ๋๋ ํญ์ ์์ ๋
ธ๋ ๋ณด๋ค ์ปค์ผํ๋ค
ํ์ ๋
ธ๋๋ค ์ฌ์ด์ ์์๋ ์๊ด ์๋ค
[15, 10, 8, 9, 7, 2, 3]
15
/ \
10 8
/ \ / \
9 7 2 3
*/
์์ ์ต๋ ์ด์ง ํ์ ์์๋ฅผ ๋ดค์๋ ๋ถ๋ชจ ๋ ธ๋์ ์์ ๋ ธ๋์์ ์์น ๊ด๊ณ์๋ ์ํ์ ๊ท์น์ด ์กด์ฌํ๋ค.
- ์์ ๋ ธ๋ ์ธ๋ฑ์ค = 2n + 1(์ผ์ชฝ ์์), 2n + 2(์ค๋ฅธ์ชฝ ์์) // (n = ๋ถ๋ชจ ๋ ธ๋์ ์ธ๋ฑ์ค ๋ฒํธ)
- ๋ถ๋ชจ ๋ ธ๋ ์ธ๋ฑ์ค = Math.floor((n - 1) / 2) // (n = ์์ ๋ ธ๋์ ์ธ๋ฑ์ค ๋ฒํธ)
์์ ์ํ ๊ณต์์ ์ด์ฉํ์ฌ ๋ฐฐ์ด์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌํ๊ณ ์ด๋ฅผ ํตํด ์ด์ง ํ ์๋ฃ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ ์ ์๋ค.
18.3 ์ด์ง ํ ํด๋์ค
์ด์ง ํ์ ๊ตฌํํ๋ ์ด๊ธฐ ์ค์ ์ด ์ด์ง ํ์ ํธ๋ฆฌ์๋ ๋ค๋ฅด๋ค. ์ด์ง ํ ์์๋ ๋ ธ๋ ์ธ์คํด์ค๋ฅผ ๋ฐ๋ก ์์ฑํ ํ์๊ฐ ์๋ค. ์ด์ง ํ ๊ตฌํ ์์ฒด๋ฅผ ๋ฐฐ์ด์ ํตํด์ ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ ํ์ํ ๊ฒ์ ๋น์ด ์๋ ๋ฐฐ์ด ํ๋๋ก ์ด๊ธฐ ์ค์ ์ ๋ง์น๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ ์ด์ ์ผ์ชฝ๋ถํฐ ์์ ๋ ธ๋๊ฐ ์ฑ์์ง๋ ๊ฒ์ด๋ค. ๊ฒฐ๊ตญ ๋น ๋ฐฐ์ด์ ์ด์ง ํ ๊ตฌ์กฐ์ ๋ง๊ฒ ๋ฐฐ์ด์ ๊ตฌ์ฑํ๋ ๊ฒ์ด ํต์ฌ์ด๋ค.
// ์ต๋ ์ด์ง ํ์ ๊ธฐ์ค์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌํ
class MaxBinaryHeap {
constructor(){
this.values = [];
}
}
18.4 Insert ๋ฉ์๋
insert ๋ฉ์๋๋ ์ด์ง ํ ์๋ฃ ๊ตฌ์กฐ์ ๊ฐ์ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค. ์ฆ, ๋ฐฐ์ด์ ์์๋ฅผ ์ถ๊ฐํ๊ณ ์ด๋ฅผ ์ด์ง ํ ๊ตฌ์กฐ์ ๋ง๊ฒ ์ ํด์ง ์์น๋ก ์ ๋ ฌ์ํค๋ ๊ฒ์ด๋ค. ์ ๋ ฌ์ ํ๋ ๋ฐฉ๋ฒ์ ์ฐ์ ์ถ๊ฐ ํ๊ณ ์ ํ๋ ์์๋ฅผ ๋ฐฐ์ด์ ๋งจ ๋ค์ push()๋ฅผ ํ์ฉํด์ ์ถ๊ฐํ๊ณ ์๋กญ๊ฒ ์ถ๊ฐ ๋ ๋ ธ๋๊ฐ ํ์ฌ ์ค์ ๋์ด ์๋ ๋ถ๋ชจ ๋ ธ๋๋ณด๋ค ๊ฐ์ด ํฌ๋ค๋ฉด ๋ถ๋ชจ ๋ ธ๋์ ์๋กญ๊ฒ ์ถ๊ฐ๋ ๋ ธ๋์ ์๋ฆฌ๋ฅผ ๋ฐ๊ฟ์ค๋ค. ์ด๋ฅผ ๋ฐ๋ณตํ์ฌ ์ ๋ ฌ์ ์์ผ์ค๋ค. ์ด๊ฒ ๊ฐ๋ฅํ ์ด์ ๋ ๋ฃจํธ ๋ ธ๋๋ ํญ์ ์ด์ง ํ ์๋ฃ ๊ตฌ์กฐ ๋ด์์ ๊ฐ์ฅ ํฐ ๊ฐ์ ๊ฐ์ง๊ธฐ ๋๋ฌธ์ด๋ค.(์์๋ค๊ฐ์ ์์๋ ์ค์ํ์ง ์๊ณ ๋ถ๋ชจ ๋ ธ๋๋ ํญ์ ์์ ๋ ธ๋๋ณด๋ค ์ปค์ผํ๋ค๋ ๊ท์น๋ง ์ง์ผ์ง๋ฉด ๋๋ค.) ์ด๋ฅผ ๋ณดํต '๋ฒ๋ธ ์ ' ์ด๋ผ๊ณ ํ๋ค.
โ์๋ ์ฝ๋
1) insert ์ด๋ฆ์ ๋ฉ์๋๋ฅผ ์์ฑํ๊ณ ์ซ์ ํ๋๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค.
2) ํฌ์ธํฐ ์ญํ ์ ํ ์ธ๋ฑ์ค ๋ณ์๋ฅผ ํ๋ ๋ง๋ค๊ณ ์๋กญ๊ฒ ์ถ๊ฐํ ๋ ธ๋์ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ํ ๋นํ๋ค.
3) ์ผ๋จ ๋ง์ง๋ง ์ธ๋ฑ์ค ์๋ฆฌ, ์ฆ ๋ฐฐ์ด์ ๋งจ๋ค, ๋งจ ๋ง์ง๋ง์ ์๋กญ๊ฒ ์ถ๊ฐํ ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ค.
4) ๊ทธ ํ ๋ถ๋ชจ์ ์ธ๋ฑ์ค๋ฅผ ์ฐพ๋๋ค.(์ํ ๊ณต์์ ์ด์ฉ)
5) ๊ทธ๋ฆฌ๊ณ ์ด๋ ๊ฒ์ด ๋ ํฐ์ง ๋น๊ต ํ, ์ถ๊ฐํ๊ณ ์ ํ๋ ๊ฐ์ด ๋ ํฌ๋ค๋ฉด ๋ ๊ฐ์ ์๋ฆฌ๋ฅผ ๋ฐ๊ฟ์ค๋ค.
6) ๊ทธ๋ ์ง ์๋ค๋ฉด ์ณ๋ฐ๋ฅธ ์๋ฆฌ์ ์์นํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ๊ทธ๋๋ก ๋ฉ์ถ๋ฉด ๋๋ค.
7) ๋ฐ๋๋ก ์๋ฆฌ๋ฅผ ๋ฐ๊พธ๊ฒ ๋๋ค๋ฉด ํฌ์ธํฐ ์ญํ ์ ํ๋ ์ธ๋ฑ์ค ๋ณ์์ ๋ฐ๋ ์๋ฆฌ์ ์ธ๋ฑ์ค ๋ฒํธ, ์ฆ ๋ฐ๋๊ธฐ ์ ์ ์๋ ๋ถ๋ชจ ๋ ธ๋์ ์ธ๋ฑ์ค ๋ฒํธ๋ฅผ ์ฌํ ๋นํด ์ค๋ค.
8) ๊ฐ์ฅ ์ ์๋ฆฌ ์ฆ, ๋ฃจํธ ๋ ธ๋ ์๋ฆฌ๋ก ์ค๊ฒ ๋๋ฉด ๋ ์ด์ ๋น๊ตํ์ง ์๋๋ก ์ฝ๋๋ฅผ ์ถ๊ฐํด ์ค์ผ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
// ์ต๋ ์ด์ง ํ์ ๊ธฐ์ค์ผ๋ก ์ฝ๋๋ฅผ ๊ตฌํ
class MaxBinaryHeap {
constructor(){
this.values = [];
}
insert(element){
this.values.push(element);
this.bubbleUp();
}
bubbleUp(){
let idx = this.values.length - 1;
const element = this.values[idx];
while(idx > 0){
let parentIdx = Math.floor((idx - 1)/2);
let parent = this.values[parentIdx];
if(element <= parent) break;
this.values[parentIdx] = element;
this.values[idx] = parent;
idx = parentIdx;
}
}
}
18.5 ExtractMax ๋ฉ์๋
ExtractMax๋ ์ต๋ ์ด์ง ํ์์ ๋ฃจํธ ๋ ธ๋๋ฅผ ์ ๊ฑฐํ๋ ๊ธฐ๋ฅ์ ํ๋ ๋ฉ์๋๋ค. ์ฆ, ์ต๋ ์ด์ง ํ์์๋ ๊ฒฐ๊ตญ ์ต๋๊ฐ์ธ ๋ฃจํธ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ด๊ณ , ์ต์ ์ด์ง ํ์์๋ ๊ฒฐ๊ตญ ์ต์๊ฐ์ธ ๋ฃจํธ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ฃจํธ์ ์๋ง์ ๊ฐ์ด ์ฌ ์ ์๋๋ก ํด์ฃผ์ด์ผ ํ๋ค. ๋ณดํต ์ด๋ฅผ '์ฑํฌ ๋ค์ด', '๋ฒ๋ธ ๋ค์ด'์ด๋ผ๊ณ ํํํ๋ค. ์ ์ฒด์ ์ธ ๋ฐฉ๋ฒ์ ์ฐ์ ๊ฐ์ฅ ๋จผ์ ๋ฃจํธ ๋ ธ๋์ ๋ฐฐ์ด์ ๋ง์ง๋ง์ ์์นํ ๋ ธ๋์ ์์น๋ฅผ ์ค์ํด์ฃผ๊ณ , pop() ๋ฉ์๋๋ฅผ ํ์ฉํ์ฌ ๊ธฐ์กด ๋ฃจํธ ๋ ธ๋๋ฅผ ์ ๊ฑฐํด ์ค๋ค. ๊ทธ๋ผ ๋ฐฐ์ด์ ๋งจ ๋ค์ ๋ ธ๋๋ ๋ฃจํธ ๋ ธ๋๊ฐ ๋๋ค. ๊ทธ ํ ๋ฃจํธ์ ์์๋ค ์ค(์ผ์ชฝ/์ค๋ฅธ์ชฝ) ๋ ํฐ ๊ฐ๊ณผ ๋น๊ตํ์ฌ ๋ฃจํธ ๋ ธ๋์ ๊ฐ์ด ๋ ์๋ค๋ฉด ์ค์ํด์ค๋ค. ์ด๋ฅผ ๋ฐ๋ณตํ์ฌ ์ ์๋ฆฌ๋ฅผ ์ฐพ์๊ฐ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค.
โ์๋ ์ฝ๋
1) ์ต๋ ์ด์ง ํ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์์ฑํ๊ณ ์ธ์๋ ๋ฐ์ง ์๋๋ค.
2) ์ฐ์ ๋ฃจํธ์ ํ์ ๊ฐ์ฅ ๋ ์์์ ์ค์ํ๊ณ ์ ์ผ ๋ค๋ก ๊ฐ ๊ฐ์ ์ ๊ฑฐํ๋ค(pop())
3) ์๋ก์ด ๋ฃจํธ ๋ ธ๋๋ ๋น์ฐํ 0๋ฒ ์ธ๋ฑ์ค์ ์์นํ๊ณ , ์์ ๋ ธ๋๋ค๊ณผ ๋น๊ตํด ๋๊ฐ๋ฉด์ ๊ฐ๋ผ์๊ฒ ๋๋ค.
4) ์ธ๋ฑ์ค ์นด์ดํฐ๋ผ๋ ๋ณ์๋ฅผ ๋ง๋ค๊ณ 0์์ ์์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ์ธ๋ฑ์ค ์์์ ์ผ์ชฝ ์ค๋ฅธ์ชฝ ์์์ ์ฐพ๋๋ค(์ํ ๊ณต์ ์ด์ฉ)
5) ๊ทธ ๋ค์ ๋ ์์๋ค ์ค ๋ ํฐ ์์๋ฅผ ๋ถ๋ชจ ์์น์ ์์์ ๋น๊ตํ๋ค.
6) ์์์ด ๋ ํฌ๋ค๋ฉด ๋ถ๋ชจ์ ์์์ ์์น๋ฅผ ๋ฐ๊พผ๋ค.
7) ์๋ฆฌ๋ฅผ ๋ฐ๊พผ ์์์ ์ธ๋ฑ์ค๋ฅผ ์๋ก์ด ๋ถ๋ชจ ์ธ๋ฑ์ค๋ก ์ค์ ํด ์ฃผ๊ณ , ์๋ก์ด ์์์ ์ฐพ์ผ๋ฉด์ ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ์ฌ ๋ฃจํ๋ฅผ ๋๊ณ ์๋ฆฌ๋ฅผ ๋ฐ๊พธ๋ ๊ฒ์ด๋ค.
8) ์ด ๊ณผ์ ์ ๋ ์์์ด ํด๋น ์์๋ณด๋ค ๋ ํฌ์ง ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
9) ๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ ์์ ๋ฃจํธ๋ฅผ ์ถ๋ ฅํด ์ค๋ค.
class MaxBinaryHeap {
constructor(){
this.values = [];
}
insert(element){
this.values.push(element);
this.bubbleUp();
}
bubbleUp(){
let idx = this.values.length - 1;
const element = this.values[idx];
while(idx > 0){
let parentIdx = Math.floor((idx - 1)/2);
let parent = this.values[parentIdx];
if(element <= parent) break;
this.values[parentIdx] = element;
this.values[idx] = parent;
idx = parentIdx;
}
}
extractMax(){
this.max = this.values[0];
this.end = this.values.pop() // ์ ๊ฑฐ๋ ์์๊ฐ ๋ฐํ๋จ
if(this.values.length > 0){
this.values[0] = end; // ๋ฐฐ์ด์ ์์๊ฐ ํ๋๊ฐ ๋จ์์๋๋ฅผ ๋ฐฉ์ง! ์ด๊ฒ ์์ผ๋ฉด ๊ณ์ ํ๋๊ฐ ๋จ์ ์์
this.sinkDown();
}
return max;
}
sinkDown(){
let idx = 0;
const length = this.values.length;
const element = this.values[0];
while(true){
let leftChildIdx = 2 * idx + 1;
let rightChildIdx = 2 * idx + 2;
let leftChild;
let rightChild;
let swap = null;
if(leftChildIdx < length){
leftChild = this.values[leftChildIdx];
if(leftChild > element){
swap = leftChildIdx; // ์ด๋๋ก ์๋ฆฌ๋ฅผ ๋ฐ๊ฟจ๋์ง ์ถ์ ํ๋ํ๊ธฐ ์ํด ํ ๋น
}
}
if(rightChildIdx < length){
rightChild = this.values[rightChildIdx];
if(
(swap === null && rightChild > element) ||
(swap !== null && rightChild > leftChild)
) {
swap = rightChildIdx;
}
}
if(swap === null) break;
this.values[idx] = this.values[swap]; //์๋ฆฌ ๋ฐ๊พธ๊ธฐ
this.values[swap] = element; // ์๋ฆฌ ๋ฐ๊พธ๊ธฐ
idx = swap; // ๊ทธ ๋ค์ ์์๋ค์ ์ฐพ๊ธฐ ์ํด์ ์ธ๋ฑ์ค๋ ๋ฐ๊ฟ์ค์ผํจ
}
}
}
18.6 ์ฐ์ ์์ ํ
์ฌํ๊น์ง ์ด์ง ํ์ ๋ํด์ ๊ณต๋ถํ์๋๋ฐ ์ด์ง ํ์ ๋ฐฐ์ฐ๋ ์ด์ ์ค ํ๋๋ ๋ฐ๋ก ์ฐ์ ์์ ํ๋ฅผ ๋ง๋ค๊ธฐ ์ํจ์ด๋ค. ์ฐ์ ํ๋ ์ ์ ์ ์ถ ๊ตฌ์กฐ์ ์๋ฃ ๊ตฌ์กฐ๋ผ๊ณ ์์ ๊ณต๋ถํ๋๋ฐ ์ฐ์ ์์ ํ๋ ๊ฐ ์์๊ฐ ๊ทธ์ ํด๋นํ๋ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋งํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์์๊ฐ ๋ ๋ฎ์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ์์๋ณด๋ค ๋จผ์ ์ฒ๋ฆฌ๊ฐ ๋๋ค. ์ฆ ๋ฐ์ดํฐ ๋ชจ์์ด ์๊ณ ๊ฐ ๋ ธ๋๋ ์์๊ฐ ๊ฐ๊ฐ์ ์ฐ์ ์์ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ ๊ฒ์ด๋ค. ์ฐ์ ์์ ํ๋ ์๋ก ๋ค๋ฅธ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ ๋ฐ์ดํฐ๋ ์ ๋ณด๋ฅผ ๊ด๋ฆฌํ ํ์๊ฐ ์๋ ๊ฒฝ์ฐ์ ํ์ฉ๋๋ค.
ํ๋ ์ฃผ์ํด์ผ ํ ์ ์ ์ฐ์ ์์ ํ๊ฐ ํ๊ณผ๋ ๋ณ๊ฐ์ ๊ฐ๋ ์ด๋ผ๋ ๊ฒ์ด๋ค. ์ฐ์ ์์ ํ๋ ์ถ์์ ์ธ ๊ฐ๋ ์ ๋ถ๊ณผํ๋ค. ์ฐ์ ์์ ํ๋ ๋ฐฐ์ด์ด๋ ์ฐ๊ฒฐ ๋ฆฌ์คํธ๋ฅผ ๊ฐ์ง๊ณ ๋ ๋ง๋ค ์ ์๋ค. ์ฆ ์ฐ์ ์์ ํ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ์ ์ํด ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ง ๊ฐ์ถ๋ค๋ฉด ์ฐ์ ์์ ํ๊ฐ ๋๋ ๊ฒ์ด๋ค. ๊ทธ๋์ ์ด์ง ํ์ ์ฌ์ฉํด์ ์ฐ์ ์์ ํ๋ฅผ ๊ตฌํํ๋ ๊ฒ๋ ํ๋์ ๋ฐฉ๋ฒ์ผ ๋ฟ์ด๋ค. ์ด์ง ํ์์ ๋ฃจํธ๋ฅผ ์ ๊ฑฐํ๋ ์ฑ์ง์ ํด์ฉํด์ ๊ตฌํํด ๋ณด๋ ๊ฒ์ด๋ค. ๋ฃจํธ๊ฐ ์ ๊ฑฐ๋๋ฉด ๋ฒ๋ธ ๋ค์ด์ด ๋๋ฉด์ ๋ ์๋ก์ด ๋ฃจํธ๊ฐ ๊ฒฐ์ ๋๋ ๊ฒ์ ์ด์ฉํ ๋ฟ์ด๋ค.
18.7 ์ฐ์ ์์ ํ & ๋ ธ๋ ํด๋์ค
์ฐ์ ์์ ํ ์์ฒด๋ ์ด์ง ํ๊ณผ ๊ฐ์ด ๋ฐฐ์ด๋ก ์ด๊ธฐ ์ค์ ์ด ๋์ง๋ง, ์ด์ง ํ๊ณผ ๋ค๋ฅด๊ฒ ์ฐ์ ์์ ํ๋ ๋ ธ๋ ๊ฐ์ฒด๋ก ๊ตฌ์ฑ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฐ ๋ ธ๋๋ค์ value์ priority(์ฐ์ ์์)๋ฅผ ํ๋กํผํฐ๋ก ๊ฐ๋๋ค.
class PriorityQueue{
constructor(){
this.values = [];
}
}
//์ฌ๊ธฐ๊น์ง๋ ์ด์ง ํ๊ณผ ๋์ผํจ
// ๋ค๋ฅธ ๋ถ๋ถ์ ์ฐ์ ์์ ํ๋ ๋
ธ๋๋ฅผ ๊ฐ์ง๋ค
class Node{
constructor(val, priority){
this.val = val;
this.priority = priority;
}
}
์ฃผ์ ํด์ผํ ์ ์ ๋ ธ๋์ ๊ฐ์ ์ฐ์ ์์ ํ์ ์ํฅ์ด ์๋ค. ์ฐ์ ์์ ๋น๊ต๋ ์ค๋ก์ง priority์ ๊ฐ ๋ง์ ์ฌ์ฉํ๋ค. ์ฆ, priority์ ๊ฐ์ด ์ค์ ๋ก ํ์ ๊ตฌ์ฑํ๊ณ ์ฌ์ ๋ ฌํ๋๋ฐ ์ฌ์ฉํ ๊ฐ์ด๋ค. ์ต๋ ์ด์ง ํ์ ๊ฒฝ์ฐ priority์ ๊ฐ์ด ํด์๋ก ์ฐ์ ์์๊ฐ ์ฌ๋ผ๊ฐ๋ ๊ฒ์ด๊ณ ์ต์ ์ด์ง ํ์ ๊ฒฝ์ฐ์๋ priority์ ๊ฐ์ด ์์์๋ก ์ฐ์ ์์๊ฐ ์ฌ๋ผ๊ฐ๋ ๊ฒ์ด๋ค. ๋ค์ ํ ๋ฒ ๋งํ์ง๋ง, ๊ฐ์ฅ ์ค์ํ ๊ฒ์ priority์ ๊ฐ์ ๊ฐ์ง๊ณ ์ด์ง ํ์ ๋ง๋๋ ๊ฒ์ด๋ค.(value๊ฐ์ ๋น๊ตํ๋ฉด ์๋๋ค.) ๊ทธ๊ฒ์ ์ ์ธํ๊ณ ๋ ์ด์ง ํ์ ๊ตฌํํ๋ ๊ฒ๊ณผ ๊ฑฐ์ ๋์ผํ๋ค. ์ฌ์ค ์ด์ง ํ์ ์ด์ฉํด์ ์ฐ์ ์์ ํ๋ฅผ ๊ตฌํํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
// ์ต์ ์ด์ง ํ์ ํตํ ์ฐ์ ์์ ํ ๊ตฌํ
class PriorityQueue {
constructor(){
this.values = [];
}
enqueue(val, priority){
let newNode = new Node(val, priority);
this.values.push(newNode);
this.bubbleUp();
}
bubbleUp(){
let idx = this.values.length - 1;
const element = this.values[idx];
while(idx > 0){
let parentIdx = Math.floor((idx - 1)/2);
let parent = this.values[parentIdx];
if(element.priority >= parent.priority) break;
this.values[parentIdx] = element;
this.values[idx] = parent;
idx = parentIdx;
}
}
dequeue(){
const min = this.values[0];
const end = this.values.pop();
if(this.values.length > 0){
this.values[0] = end;
this.sinkDown();
}
return min;
}
sinkDown(){
let idx = 0;
const length = this.values.length;
const element = this.values[0];
while(true){
let leftChildIdx = 2 * idx + 1;
let rightChildIdx = 2 * idx + 2;
let leftChild,rightChild;
let swap = null;
if(leftChildIdx < length){
leftChild = this.values[leftChildIdx];
if(leftChild.priority < element.priority) {
swap = leftChildIdx;
}
}
if(rightChildIdx < length){
rightChild = this.values[rightChildIdx];
if(
(swap === null && rightChild.priority < element.priority) ||
(swap !== null && rightChild.priority < leftChild.priority)
) {
swap = rightChildIdx;
}
}
if(swap === null) break;
this.values[idx] = this.values[swap];
this.values[swap] = element;
idx = swap;
}
}
}
class Node {
constructor(val, priority){
this.val = val;
this.priority = priority;
}
}
18.8 ์ด์ง ํ ๋น ์ค ํ๊ธฐ๋ฒ
- Insertion : O(logN)
- Removal : O(logN)
- Search : O(N)
์ด์ง ํ์ ์ต๋ ํ์ด๋ ์ต์ ํ์ด๋ ์ฝ์ ๊ณผ ์ญ์ ์ ์์ด์ ์์ฃผ ์ฑ๋ฅ์ด ์ข๋ค.
'๐ Language & CS knowledge > Algorithm & Data structure' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
20 ๊ทธ๋ํ (0) | 2022.08.17 |
---|---|
19 ํด์ ํ ์ด๋ธ (0) | 2022.08.16 |
17 ํธ๋ฆฌ ์ํ (0) | 2022.08.16 |
16 ์ด์ง ๊ฒ์ ํธ๋ฆฌ (0) | 2022.08.14 |
15 ์คํ & ํ (0) | 2022.08.14 |