๋ฐ์ดํฐ ๋ฒ ์ด์ค๋ ์ด๋ก ์ ๋ฌดํ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ์ ์์ด์ผ ํ๊ธฐ ๋๋ฌธ์, ์๋ง์ ๋ฐ์ดํฐ๋ฅผ ์ผ๋ง๋ ๋น ๋ฅด๊ฒ ์ ๋ ฌํ๋ ๊ฐ๋ ์ค์ํ ๋ฌธ์ ์ด๋ค.
๐ค ๊ทธ๋ ๋ค๋ฉด ์ ๋ฐ์ดํฐ๋ ์ ๋ ฌ๋์ด ์์ด์ผํ ๊น?
๊ฐ๋จํ ๋งํ์๋ฉด ํ์์ ์ํด์ ์ด๋ค.
์ ๋ ฌ๋์ด ์์ง ์์ ๋ฐ์ดํฐ์์๋ ์์ฐจ ํ์(O(N)) ๋ฐ์ ์ฌ์ฉํ ์ ์์ผ๋, ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์๋ค๋ฉด ์ด์ง ํ์(O(logN))์ด๋ผ๋ ์๊ณ ๋ฆฌ์ฆ์ ํ์ฉํ ์ ์๋ค.
์ฝ์ /์ญ์ ๊ฐ ์์ฃผ ์ผ์ด๋๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ์ ๋ ฌ์ ๋ ๋ง์ด ์๊ฐ์ด ๋ค์ด๊ฐ์ผ๋ก ์์ฐจ ํ์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์์ง๋ง, ๋ณดํต์ ๊ฒฝ์ฐ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ๊ฒฝ์ฐ๊ฐ ํจ์ฌ ๋ง๋ค. ๊ทธ๋ฆฌ๊ณ ์กฐํ์ ํ์ํ ๊ฒ์ด ๊ฒ์(ํ์)์ด๋ค.
1. ๋ฒ๋ธ ์ ๋ ฌ
์ต๋๊ฐ์ ์ฐ์ ์ ์ผ๋ก ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๐ ๋์ ๋ฐฉ์
- 0๋ถํฐ N-1๊น์ง ํ์ํ๋ฉด์ ์ธ์ ํ ์นธ๊ณผ ๋น๊ตํ์ฌ swapํ๋ ๋ฐฉ์์ด๋ค.
- ์ฒซ ๋ฒ์งธ๋ 0~N-1, ๋ ๋ฒ์งธ๋ 0~N-2 ์ด๋ฐ ์์ผ๋ก ์งํ๋๋๋ฐ ๊ทธ ์ด์ ๋ 1ํ ์ค์ํ ๋ ์ต๋๊ฐ์ ์ด๋ฏธ ๋งจ ๋ค๋ก ์ ์ฅ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ์ดํด๋ณด์.


๐ ์๊ฐ ๋ณต์ก๋
์๊ฐ ๋ณต์ก๋๋ ์๋์ ์์ผ๋ก ์ธํด N์ ๊ณฑ์ ๊ฐ์ง๋ค.
$$(N-1) + (N-2) + (N-3) + ... + 1 = 1/2N^2 - 1/2N = O(N^2)$$
2. ์ ํ ์ ๋ ฌ
์ต์๊ฐ์ ์ฐ์ ์ ์ผ๋ก ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๐ ๋์ ๋ฐฉ์
- ํ์์ ์์ํ๋ Index๋ฅผ ์ต์ ๊ฐ์ ๊ฐ์ง๋ Index๋ผ๊ณ ๊ฐ์ ํ๋ค.
- ์ค๋ฅธ์ชฝ์ผ๋ก ํ์์ ์งํํ๋ฉฐ ๋ ์์ ๊ฐ์ ๋ง๋๋ฉด ์ต์ ๊ฐ์ ๊ฐ์ง๋ Index๋ฅผ ๋ณ๊ฒฝํ๋ค.
- ๋๊น์ง ๋๋ฌํ์ ๋, ํ์์ ์์ํ๋ Index์ ๊ฐ๊ณผ ์ต์ ๊ฐ์ ๊ฐ์ง๋ Index์ ๊ฐ์ swap ํ๋ค.
์ด๋ฅผ ๊ทธ๋ฆผ์ผ๋ก ์ดํด๋ณด์.

๐ ์๊ฐ๋ณต์ก๋
์๊ฐ ๋ณต์ก๋๋ ์๋์ ์์ผ๋ก ์ธํด N์ ๊ณฑ์ ๊ฐ์ง๋ค.
$$(N-1) + (N-2) + (N-3) + ... + 1 = 1/2N^2 - 1/2N = O(N^2)$$
3. ํต ์ ๋ ฌ
์ผ์ ํ ๊ธฐ์ค์ ์ก๊ณ , ๋ ์์ ๊ฐ์ ์ผ์ชฝ์ผ๋ก ๋ ํฐ ๊ฐ์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๐ ๋์ ๋ฐฉ์
- pivot ๊ฐ์ ์ง์ ํ๋ค. (pivot ๊ฐ์ ์ง์ ํ๋ ๋ฐฉ์์ ์๊ณ ๋ฆฌ์ฆ๋ง๋ค ๋ค๋ฅด๋, ํ์ฌ๋ ๊ฐ์ฅ ์ผ์ชฝ์ ๊ฐ์ ์ง์ ํ๊ฒ ๋ค.)
- left/right(๋ฐฐ์ด ๊ฐ์ฅ ์ผ์ชฝ์ Index/๋ฐฐ์ด ๊ฐ์ฅ ์ค๋ฅธ์ชฝ์ Index)๋ฅผ ์ง์ ํ๋ค.
- left์์ ์ค๋ฅธ์ชฝ์ผ๋ก ํ์ํ๋ฉฐ pirvot ๊ฐ๋ณด๋ค ํฐ ๊ฐ์ ์ฐพ๋๋ค. right์์ ์ผ์ชฝ์ผ๋ก ํ์ํ๋ฉฐ pivot ๊ฐ๋ณด๋ค ๋ ์์ ๊ฐ์ ์ฐพ๋๋ค.
- left, right์ ์ด๋์ด ๋ฉ์ถ๋ฉด "left <= right"๋ฅผ ํ์ธํ๋ค.
- If true: ๋ ์ธ๋ฑ์ค์ ๊ฐ์ swapํ๋ค. ๊ทธ๋ฆฌ๊ณ 3๋ฒ์ผ๋ก ๋์๊ฐ๋ค.
- If false: 5๋ฒ์ผ๋ก ๋์ด๊ฐ๋ค.
- right์ pivot์ ๊ฐ์ swapํ๋ค. (์ด๋ก์จ pivot ๊ฐ์ ๋ํ ์ ๋ ฌ์ ์๋ฃ๋์๋ค.)
- pivot ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ, ์ค๋ฅธ์ชฝ ๋ฐฐ์ด์ ๋ํด์ 1๋ฒ ๊ณผ์ ๋ถํฐ ๋ฐ๋ณตํ๋ค.
๐ ์๊ฐ ๋ณต์ก๋
์ด์์ ์ธ pivot ๊ฐ์ ๊ณจ๋ผ ์ ํํ๊ฒ ๋ฐ์ผ๋ก ๋๋์ด์ง ๊ฒฝ์ฐ์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ณ์ฐํด๋ณด์.
pivot๊ฐ์ ์ค์ฌ์ผ๋ก 2๊ฐ๋ก ๋๋์ด์ง๋ ๊ฒ์ด ํธ๋ฆฌํ ๋ชจ๋ธ์ ๋ฎ์์๋ค.
๊ทธ๋ผ ์์๊ฐ 1์ธ ๋ฐฐ์ด๊น์ง ์ชผ๊ฐฐ์ ๋, ์ด ๋ชจ๋ธ์ ๊น์ด๋? logN์ผ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ ์ธต์์ ์ฐ์ฐ์ด ์ด N๋ฒ ๋ฐ๋ณต๋๊ธฐ ๋๋ฌธ์ ์ด ์๊ฐ ๋ณต์ก๋๋ O(NlogN)์ด๋ค.
์๋ ๊ทธ๋ฆผ์ ๋ณด๋ฉด ์ดํด๊ฐ ์ฌ์ธ ๊ฒ์ด๋ค.

๋ฐ๋๋ก ์ต์ ์ ๊ฒฝ์ฐ๋ก ์ต์๊ฐ๊ณผ ์ต๋๊ฐ์ ๊ณ์ํด์ ๋ฝ์ ๊ฒฝ์ฐ๋ ์๋์ ๊ฐ๋ค.
$$(N-1) + (N-2) + (N-3) + ... + 1 = 1/2N^2 - 1/2N = O(N^2)$$
๐ ํน์ง
- pivot ๊ฐ์ ๋ฐ๋ผ ์๊ฐ ๋ณต์ก๋๊ฐ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ์ค์๊ฐ์ ๊ฐ๊น์ด pivot ๊ฐ์ ์ ํํ ์ ์๋ ์ ๋ต์ด ์๊ตฌ๋๋ค.
- ์์ ๊ฐ์๊ฐ ์ ์ด์ง์๋ก ๋์ ์ค๊ฐ๊ฐ์ด ์ ํ๋ ํ๋ฅ ์ด ๋๋ค. ์์ ๊ฐ์์ ๋ฐ๋ผ ํต ์ ๋ ฌ์ ๋ค๋ฅธ ์ ๋ ฌ์ ํผํฉํด์ ์ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค.
- Python์ list.sort() ํจ์๊ฐ ํต ์ ๋ ฌ์ ๊ธฐ๋ณธ์ผ๋ก ์ฌ์ฉํ๋ค.
4. ๋ณํฉ ์ ๋ ฌ
๋ฐฐ์ด์ ๋ชจ๋ ๋ถ๋ฆฌํ๊ณ , ์ ๋ ฌํ๋ฉด์ ํฉ์น๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๐ ๋์ ๋ฐฉ์
- ์ฌ๊ท ํจ์๋ฅผ ํตํด์ ์์๊ฐ 1๊ฐ๊ฐ ๋ ๋๊น์ง ๋๋๋ค.
- ๋๋์ด์ง ๋ฐฐ์ด์ ๋ค์ ํฉ์น๋ค.
- ๋ ๋ฐฐ์ด์ ๊ฐ์ฅ ์ผ์ชฝ์ ์ธ๋ฑ์ค๋ฅผ ๊ฐ๊ฐ left_index, right_index๋ก ์ง์ ํ๋ค.
- ์์ ๋ฐฐ์ด(temp)๋ฅผ ์์ฑํ๊ณ , left_index์ right_index์ ๊ฐ์ ๋น๊ตํด ๋ ์์ ๊ฐ์ temp์ ์ฝ์ ํ๋ค. ๋ ์์ ๊ฐ์ ์ฝ์ ํ ๋ฐฐ์ด์ index๋ 1์ ๋ํ๋ค. (์ค๋ฅธ์ชฝ์ผ๋ก ํ์)
- ๋ ๋ฐฐ์ด ์ค ํ ๋ฐฐ์ด์ ํ์์ด ๋๋ ๋๊น์ง 2๋ฒ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ค.
- ํ ๋ฐฐ์ด์ ํ์์ด ๋๋ฌ๋ค๋ฉด ๋๋จธ์ง ๋ฐฐ์ด์ ๊ฐ์ temp์ ์ฝ์ ํ๋ค.
๊ทธ๋ฆผ์ผ๋ก ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.

๐ ์๊ฐ ๋ณต์ก๋
ํต์ ๋ ฌ๊ณผ ๋น๊ตํด๋ณด์!
๋ณํฉ์ ๋ ฌ์ ํต์ ๋ ฌ๊ณผ ๋น์ทํ๊ฒ ํธ๋ฆฌํ์ ๋ชจ๋ธ์ ๋์ด์ ๋๋๋ ํ์๊ฐ ๊ฐ๊ณ , ์ธต๋ง๋ค N๋ฒ ์ฐ์ฐ์ ํ๊ธฐ ๋๋ฌธ์ ์ด ์๊ฐ ๋ณต์ก๋๋ O(NlogN)์ด๋ค.

ํ์ง๋ง ์ด๋ ํต์ ๋ ฌ์์ pivot ๊ฐ์ ์ด์์ ์ผ๋ก ์ก์์ ๋์ ์๊ธฐ์ด๋ค. ํต์ ๋ ฌ์ ์ต์ ์ ๊ฒฝ์ฐ์๋ N์ ๊ณฑ์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋ค.
๊ทธ๋ฐ๋ฐ ๋ณํฉ์ ๋ ฌ์? ๊ทธ๋ด ์ผ์ด ์๋ค. ์ด๋ค ์ํฉ์์๋ ์ ํํ ๋ฐ์ผ๋ก ๋๋๊ธฐ ๋๋ฌธ์ด๋ค.
๐ค ๊ทธ๋ ๋ค๋ฉด ๋ณํฉ์ ๋ ฌ์ด ํต์ ๋ ฌ๋ณด๋ค ๋ ์ข์ ์๊ณ ๋ฆฌ์ฆ์ผ๊น?
๊ทธ๋ ๋ค๊ณ ํ ์๋ ์๋ค. ์๋ํ๋ฉด ๋ณํฉ์ ๋ ฌ์์๋ ์์ ๋ฐฐ์ด์ธ temp๊ฐ ๋ฐฐ์ด์ ํฉ์น ๋๋ง๋ค ๋ฐ์ํ๋ ํฐ ๋จ์ ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
5. ํ ์ ๋ ฌ
์ต๋ ํ์ ๋ฃจํธ ๋ ธ๋์ ๊ฐ์ฅ ํฐ ์๋ฅผ ๋ค๋ก ๋ณด๋ด, ํฐ ์๋ถํฐ ์์๋๋ก ์ ๋ ฌํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
๐ ๋์ ๋ฐฉ์
- ์ต๋ ํ์ ๊ตฌ์ฑํ๋ค.
- 0๋ฒ ์ธ๋ฑ์ค์ N-1๋ฒ ์ธ๋ฑ์ค๋ฅผ swapํ๋ค. (N-1 ์์น์ ์ ๋ ฌ์ด ๋๋๋ค.)
- ์๋ก์ด ๋ฃจํธ ๋ ธ๋๋ก N-2๋ฒ์งธ ์ธ๋ฑ์ค๊น์ง ๋ฐฐ์ด์ ๋ํด ์ต๋ํ์ ์งํํ๋ค.
- 0๋ฒ ์ธ๋ฑ์ค์ N-2๋ฒ ์ธ๋ฑ์ค๋ฅผ swapํ๋ค. (N-2 ์์น์ ์ ๋ ฌ์ด ๋๋๋ค.)
- ์ ์ฌํญ์ ๋ฐ๋ณตํ๋ค.
๐ ์๊ฐ ๋ณต์ก๋
- ์ต๋ํ ๊ตฌ์ฑ: root๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ ธ๋๋ฅผ ํ์ธ > N-1
- ์ต๋ํ ์ฌ๊ตฌ์ฑ: root์์ ๋ด๋ ค์ด์ผ๋ก O(logN). ์ด๋ฅผ N-1๋ฒ ๋ฐ๋ณตํ๋๊น > (N-1)O(logN)
์ด ์๊ฐ๋ณต์ก๋: N-1 + (N-1)O(logN) > O(NlogN)
๊ฒฐ๋ก
| ์ด๋ฆ | ์ฅ์ |
๋จ์ | ์๊ฐ๋ณต์ก๋ (์ต์ /๋ณดํต/์ต์ ) |
| ๋ฒ๋ธ ์ ๋ ฌ | ๊ตฌํ์ด ์ฌ์ | ๋นํจ์จ์ | $$O(N^2)/O(N^2)/O(N^2)$$ |
| ์ ํ ์ ๋ ฌ | ๊ตฌํ์ด ์ฌ์ | ๋นํจ์จ์ | $$O(N^2)/O(N^2)/O(N^2)$$ |
| ํต ์ ๋ ฌ | ์คํ์๊ฐ์ด O(NlogN) | ์ฑ๋ฅ์ฐจ์ด๊ฐ ์ฌํจ | $$O(NlogN)/O(NlogN)/O(N^2)$$ |
| ํ ์ ๋ ฌ | ์คํ์๊ฐ์ด O(NlogN) | ์ถ๊ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ํ์ | $$O(NlogN)/O(NlogN)/O(NlogN)$$ |
| ์ฝ์ ์ ๋ ฌ | ์คํ์๊ฐ์ด O(NlogN) | ์ค์ ์๊ฐ์ด ๋ค๋ฅธ O(NlogN)๋ณด๋ค ๋๋ฆผ | $$O(NlogN)/O(NlogN)/O(NlogN)$$ |
์ฐธ๊ณ ๐
https://yabmoons.tistory.com/250
[ ์ ๋ ฌ ] ์ ๋ ฌ๋ณ ์ฅ๋จ์ ๋ฐ ์๊ฐ๋ณต์ก๋
์ด๋ฒ ๊ธ์์๋ ์ ๋ ฌ๋ณ ์ฅ๋จ์ ๋ฐ ์๊ฐ๋ณต์ก๋๋ฅผ ๋น๊ตํจ์ผ๋ก์จ ์ด๋ค ์ ๋ ฌ์ด ์ ์ผ ์ข๊ณ ๋์์ง๋ฅผ ์์๋ณด์ ! ์ฌ์ค ์ด ์ ๋ ฌ๋ฒ์ด ๋ฌด์กฐ๊ฑด ์ ์ผ ์ข์์ ! ๋ผ๊ณ ๋งํ ์ ์๋ ์ ๋ ฌ๋ฒ์ ์๋ค. ์๋ํ๋ฉด ๊ฐ
yabmoons.tistory.com
'Engineering ๐ป > Algorithm' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [Leetcode/Python] 96. Unique Binary Search Trees (0) | 2022.05.24 |
|---|---|
| [ํ๋ก๊ทธ๋๋จธ์ค/Python] ๊ฒฝ์ฃผ๋ก ๊ฑด์ค (0) | 2022.03.25 |
| [์๊ณ ๋ฆฌ์ฆ] ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ (feat. Leetcode) (0) | 2022.02.06 |
| [์๋ฃ๊ตฌ์กฐ] ํ (Heaps) (0) | 2022.02.05 |
| [์๋ฃ๊ตฌ์กฐ] Binary Search Tree (0) | 2022.02.05 |