Bibi's DevLog ๐ค๐
[Hello Coding ์๊ณ ๋ฆฌ์ฆ] 4. ํต ์ ๋ ฌ ๋ณธ๋ฌธ
[Hello Coding ์๊ณ ๋ฆฌ์ฆ] 4. ํต ์ ๋ ฌ
๋น๋น bibi 2021. 7. 1. 18:18[210701]
Hello Coding ์๊ณ ๋ฆฌ์ฆ
4. ํต ์ ๋ ฌ
๋ถํ ์ ๋ณต divide and conquer
: ๋ฌธ์ ํด๊ฒฐ ๋ฐฉ๋ฒ ์ค ๊ฐ์ฅ ์ ๋ช ํ ์ฌ๊ท์ ์๊ณ ๋ฆฌ์ฆ.
ํน์ ์๊ณ ๋ฆฌ์ฆ(๊ธฐ์ )์ด ์๋, ๋ฌธ์ ๋ฅผ ํ๊ธฐ ์ํ ๋ฐฉ๋ฒ๋ก ์ด๋ค.
๋ถํ ์ ๋ณต์ ์ฆ๋ช - '์ ํด๋ฆฌ๋ ํธ์ ๋ฒ Euclid's algorithm' ์ฐธ๊ณ ํ๊ธฐ
์์ : ๋๋ถ๊ฐ ์ด๋ค ๋ ์ ๋๊ฐ์ ์ ์ฌ๊ฐํ ํ ์ง๋ก ๋๋๊ณ ์ถ์ ๋.
๋ถํ ์ ๋ณต์ผ๋ก ํธ๋ ๋จ๊ณ.
- ๊ธฐ๋ณธ ๋จ๊ณ๋ฅผ ์ฐพ๋๋ค. ์ด ๋ถ๋ถ์ ๊ฐ๋ฅํ ๊ฐ์ฅ ๊ฐ๋จํ ๋ฌธ์ ์ฌ์ผ ํ๋ค.
- ์ ์ฒด ๋ฌธ์ ๊ฐ ๊ธฐ๋ณธ ๋จ๊ณ๊ฐ ๋ ๋๊น์ง ๋๋๊ฑฐ๋ ์๊ฒ ๋ง๋ ๋ค.
๋ถํ ์ ๋ณต์์๋ ์ฌ๊ท ํจ์๋ฅผ ํธ์ถํ ๋ ๋ง๋ค ๋ฌธ์ ๋ฅผ ์๊ฒ ๋๋์ด์ผ ํ๋ค.
์์
Q. ๋ฐฐ์ด์ ๋ชจ๋ ์ซ์๋ฅผ ๋ํ ํฉ๊ณ ๊ตฌํ๊ธฐ. ๋ฐ๋ณต๋ฌธ์ด ์๋ ์ฌ๊ท ํจ์๋ฅผ ์ฌ์ฉํ๋ค.
- ๊ธฐ๋ณธ ๋จ๊ณ๋ฅผ ์ฐพ๋๋ค.
- (ํฉ์ ๊ตฌํ๊ธฐ์) ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฐ์ด์? = ์์์ ๊ฐฏ์๊ฐ 0๊ฐ์ด๊ฑฐ๋ 1๊ฐ์ธ ๋ฐฐ์ด
- ์ฌ๊ท ํธ์ถ์ ํ ๋๋ง๋ค ๋ฐฐ์ด์ ํฌ๊ธฐ๊ฐ ์ ์ ๊ฐ์ํด์ผ ํจ.
- ์๋ฅผ ๋ค์ด,
[2,3,4]
์ธ ๋ฐฐ์ด์ ์ดํฉ๊ณผ[2]
,[3,4]
๋ฐฐ์ด์ ์ดํฉ์ ๊ฐ๋ค.
- ์๋ฅผ ๋ค์ด,
์ฆ sumํจ์๋ฅผ ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋์์ํจ๋ค.
- ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋๋ค
- ๋ง์ฝ ๋ฆฌ์คํธ๊ฐ ๋น์ด ์์ผ๋ฉด 0์ ๋ฐํํ๋ค.
- ๊ทธ๋ ์ง ์์ผ๋ฉด ์ดํฉ์ ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ์ซ์์ ๋๋จธ์ง ๋ฆฌ์คํธ์ ์ดํฉ์ ๋ํ ๊ฐ์ด ๋๋ค.
- ์๋ฅผ ๋ค์ด
[2,3,4]
๋ฐฐ์ด์ ์ดํฉ์ ๊ตฌํ ๋,[2]
+[3,4]
์ ํฉ์,[3,4]
๋[3]
,[4]
์ ํฉ์ ๊ตฌํด ์ต์ข ๋ต์ 9๋ก ๊ณ์ฐํด๋ธ๋ค.
โป ๋ฐฐ์ด์ ํฌํจํ๋ ์ฌ๊ทํจ์๋ฅผ ๋ง๋ค ๋, ๊ธฐ๋ณธ ๋จ๊ณ๋ ๋ณดํต ๋น ๋ฐฐ์ด์ด๋ ์์๊ฐ 1๊ฐ์ธ ๋ฐฐ์ด์ด ๋๋ค.
โ ๋ฐ๋ณต๋ฌธ์ผ๋ก ํ ์ ์๋๋ฐ ์ ์ฌ๊ทํจ์๋ก ํ์ด์ผ ํ๋๊ฐ?
โ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ functional programming์ ๋ง๋ณด๋ ๊ณผ์ ์ด๋ค. ์ผ๋ถ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด(ํ์ค์ผ)์๋ ๋ฐ๋ณต๋ฌธ์ด ์๋ค.
ํต ์ ๋ ฌ quicksort
: ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก, ์ ํ ์ ๋ ฌ๋ณด๋ค ํจ์ฌ ๋น ๋ฅด๊ณ ์์ฃผ ์ฌ์ฉ๋๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
- ๊ฐ์ฅ ๋น ๋ฅธ ์ ๋ ฌ ๋ฐฉ๋ฒ ์ค ํ๋์ด๋ค.
- ํต ์ ๋ ฌ์ ๋ถํ ์ ๋ณต ์ ๋ต์ ์ฌ์ฉํ๋ ์ข์ ์์ด๋ค.
- ํต ์ ๋ ฌ์ ๊ธฐ์ค ์์์ ๋ฐ๋ผ ์ฒ๋ฆฌ์๋๊ฐ ๋ฌ๋ผ์ง๋ค.
์์
๋ฐฐ์ด์ ํต ์ ๋ ฌ๋ก ์ ๋ ฌํด ๋ณด์.
- ๊ฐ์ฅ ๊ฐ๋จํ ๋ฐฐ์ด ์ ๋ ฌ์?
- ์์๊ฐ 0๊ฐ์ด๊ฑฐ๋ 1๊ฐ์ธ ๋ฐฐ์ด (= ์ ๋ ฌํ ํ์๊ฐ ์์ผ๋ฏ๋ก, ์๋ ๋ฐฐ์ด์ ๊ทธ๋๋ก ๋ฐํํ๋ฉด ๋จ)
-
def quicksort(array): if len(array) < 2: return array
- ์์๊ฐ 2๊ฐ์ธ ๋ฐฐ์ด์?
- ์ฒซ ๋ฒ์งธ ์์๊ฐ ๋ ๋ฒ์งธ ์์๋ณด๋ค ์์์ง ํ์ธํ๋ค.
- ๋ง์ฝ ๊ทธ๋ ์ง ์๋ค๋ฉด ๋ ์์์ ์๋ฆฌ๋ฅผ ๊ตํํ๋ค.
- ์์๊ฐ 3๊ฐ ์ด์์ธ ๋ฐฐ์ด์?
- ๋ฐฐ์ด์์ ๊ธฐ์ค ์์pivot ๋ฅผ ๊ณ ๋ฅธ๋ค.
- ๋ถํ partitioning : ๊ธฐ์ค ์์๋ณด๋ค ์์ ํ์ ๋ฐฐ์ด - ๊ธฐ์ค ์์ - ๊ธฐ์ค ์์๋ณด๋ค ํฐ ํ์ ๋ฐฐ์ด ๋ก ๋ถ๋ฅํ๋ค.
- ํ์ ๋ฐฐ์ด sub-array : ์์ง ์ ๋ ฌ๋์ด ์์ง ์์. ์ด ํ์๋ฐฐ์ด๋ค์ ์ ๋ ฌํ๋ฉด ์ ์ฒด ๋ฐฐ์ด๋ ์ ๋ ฌ๋ ๋ฐฐ์ด์ด ๋๋ค.
- ํ์ ๋ฐฐ์ด์ ๋ํด์๋ ์ฌ๊ท์ ์ผ๋ก ํต ์ ๋ ฌ์ ํธ์ถํ ๋ค์, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํฉ์น๋ค.
ํต ์ ๋ ฌ ์ฝ๋
def quicksort(array):
if len(array) < 2: ## ๊ธฐ๋ณธ ๋จ๊ณ : ์์์ ๊ฐ์๊ฐ 0๊ฐ์ด๊ฑฐ๋ 1๊ฐ์ผ ๋ (์ ๋ ฌํ ํ์๊ฐ ์์)
return array
else: ## ์ฌ๊ท ๋จ๊ณ
pivot = array[0]
less = [i for i in array[1:] if i <= pivot] ## ๊ธฐ์ค ์์๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ๋ชจ๋ ์์๋ก ์ด๋ฃจ์ด์ง ํ์ ๋ฐฐ์ด
greater = [i for i in array[1:] if i > pivot] ## ๊ธฐ์ค ์์๋ณด๋ค ํฐ ์์๋ก ์ด๋ฃจ์ด์ง ํ์ ๋ฐฐ์ด
return quicksort(less) + [pivot] + quicksort(greater)
print quicksort([10, 5, 2, 3])
๋น ์ค ํ๊ธฐ๋ฒ ๋ณต์ต
์๋๋ก ๊ฐ์๋ก ๋๋ฆฐ ์๊ณ ๋ฆฌ์ฆ, ์๋ก ๊ฐ์๋ก ๋น ๋ฅธ ์๊ณ ๋ฆฌ์ฆ
O(logn)
: ์ด์ง ํ์O(n)
: ๋จ์ ํ์O(n logn)
: ํต ์ ๋ ฌ, ๋ณํฉ ์ ๋ ฌ merge sortO(n์ ๊ณฑ)
: ์ ํ ์ ๋ ฌO(n!)
: ์ธํ์ ๋ฌธ์
ํต ์ ๋ ฌ์ ๊ธฐ์ค ์์์ ๋ฐ๋ผ ์ฒ๋ฆฌ์๋๊ฐ ๋ฌ๋ผ์ง๋ค.
- ์ต์
์ ๊ฒฝ์ฐ
O(n์ ๊ณฑ)
- ๊ทธ๋ฌ๋ ํ๊ท ์ ์ผ๋ก๋
O(n logn)
์ ์๋๋ก ์ฒ๋ฆฌ๋จ.
๋ณํฉ ์ ๋ ฌ๊ณผ ํต ์ ๋ ฌ ๋น๊ต
๋ณํฉ ์ ๋ ฌO(n logn)
์ด๊ณ ํต ์ ๋ ฌO(n logn)
์ด์ง๋ง
๋น ์คํ๊ธฐ๋ฒ์ ๋ฌด์๋๋ ์์(c, constant) ๊ฐ์ ํต ์ ๋ ฌ์ด ๋ณํฉ ์ ๋ ฌ๋ณด๋ค ์๋ค.
๋ฐ๋ผ์ ์คํ ์๊ฐ์ด O(n logn)
์ผ๋ก ๋์ผํ๋ค๋ฉด ํต ์ ๋ ฌ์ด ๋ ๋น ๋ฅด๋ค(์์๊ฐ์ด ์๊ธฐ ๋๋ฌธ)
ํ๊ท ์ ์ธ ๊ฒฝ์ฐ vs ์ต์ ์ ๊ฒฝ์ฐ
ํต ์ ๋ ฌ์ ์ฑ๋ฅ์ '๊ธฐ์ค ์์pivot'์ ํฌ๊ฒ ์ข์ฐ๋๋ค.
์๋ฅผ ๋ค์ด ๊ฐ์ ๋ฐฐ์ด์ด๋ผ๋..
- ์ต์
์ ๊ฒฝ์ฐ ์ฒซ ๋ฒ์งธ ์์๋ฅผ ๊ธฐ์ค์์๋ก ์ ํํ๋ ๊ฒฝ์ฐ
- ๋ฐฐ์ด์ ๊ธธ์ด(n)๋งํผ์ ์ฝ์คํ ๊น์ด๋ฅผ ๊ฐ๊ฒ ๋จ -
O(n)
๋งํผ์ ์คํ
- ๋ฐฐ์ด์ ๊ธธ์ด(n)๋งํผ์ ์ฝ์คํ ๊น์ด๋ฅผ ๊ฐ๊ฒ ๋จ -
- ์ต์ ์ ๊ฒฝ์ฐ ์ค๊ฐ ์์๋ฅผ ๊ธฐ์ค ์์๋ก ์ ํํ๋ ๊ฒฝ์ฐ
- ๋๋ต ๋ฐฐ์ด ๊ธธ์ด ์ ๋ฐ(n/2)๋งํผ์ ์ฝ์คํ ๊น์ด๋ฅผ ๊ฐ๊ฒ ๋จ -
O(log n)
๋งํผ์ ์คํ - ์? ๊ธฐ๋ณธ ๋จ๊ณ์ ๋ ๋นจ๋ฆฌ ๋๋ฌํ๊ธฐ ๋๋ฌธ.
- ๋๋ต ๋ฐฐ์ด ๊ธธ์ด ์ ๋ฐ(n/2)๋งํผ์ ์ฝ์คํ ๊น์ด๋ฅผ ๊ฐ๊ฒ ๋จ -
โ POINT : ํต ์ ๋ ฌ์์๋ ํ์ ๋ฐฐ์ด๋ก ๋๋๊ธฐ ์ํด ๋ฐฐ์ด์ ๋ชจ๋ ์์๋ฅผ ๊ธฐ์ค ์์์ ๋น๊ตํด์ผ ํ๋ค
- ๊ธฐ์ค์์๋ณด๋ค ์์์ง ํฐ์ง ํ๋ณํด์ผ ํ๊ธฐ ๋๋ฌธ
O(n)
๋งํผ์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค.- ์ฒซ ๋จ๊ณ ๋ฟ ์๋๋ผ ์ดํ ๋ชจ๋ ์ฝ์คํ์์ ์ด๋งํผ ๋น๊ต๊ฐ ํ์ํ๋ค.
- ๋ฐฐ์ด์ ์ด๋ป๊ฒ ๋ถํ ํ๋์ง์ ๊ด๊ณ์์ด ๋ชจ๋ ๊ฒฝ์ฐ์
O(n)
๋งํผ์ ์๊ฐ์ด ๊ฑธ๋ฆฐ๋ค. - ์ต์ ์ ๊ฒฝ์ฐ
- ๊ฐ๊ฐ์ ์ฝ์คํ๋ง๋ค
O(n)
์๊ฐ์ด ๊ฑธ๋ฆฌ๊ณ , ์ฝ์คํ์ ๋์ด๋O(log n)
์ด๊ธฐ ๋๋ฌธ์, - ์ ์ฒด ์๊ณ ๋ฆฌ์ฆ ์คํ์๊ฐ์
O(n) x O(log n)
=O(n log n)
์ด๋ค.
- ๊ฐ๊ฐ์ ์ฝ์คํ๋ง๋ค
- ์ต์
์ ๊ฒฝ์ฐ
- ๊ฐ๊ฐ์ ์ฝ์คํ๋ง๋ค
O(n)
์๊ฐ์ด ๊ฑธ๋ฆฌ๊ณ , ์ฝ์คํ์ ๋์ด๋O(n)
์ด๊ธฐ ๋๋ฌธ์, - ์ ์ฒด ์๊ณ ๋ฆฌ์ฆ ์คํ์๊ฐ์
O(n) x O(n)
=O(n์ ๊ณฑ)
์ด๋ค.
- ๊ฐ๊ฐ์ ์ฝ์คํ๋ง๋ค
- ์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ
- ์ต์ ์ ๊ฒฝ์ฐ์ ๊ฐ์ ์คํ ์๋๋ฅผ ๊ฐ์ง๋ค.
- ๊ธฐ์ค ์์๋ฅผ ๋ฐฐ์ด ๋ด์์ ๋ฌด์์๋ก ์ ํํ์ ๋, ํ๊ท ์ ์ผ๋ก
O(n log n)
์ ์คํ ์๋๋ฅผ ๊ฐ์ง๊ธฐ ๋๋ฌธ.
'ํ๋ก๊ทธ๋๋ฐ > Algorithm ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Swift] ๊ทธ๋ํ์ ํ์ ์๊ณ ๋ฆฌ์ฆ DFS/BFS (์ค๋ช ๋ฐ ๊ตฌํ ์์ ) (0) | 2023.01.13 |
---|---|
[Hello Coding ์๊ณ ๋ฆฌ์ฆ] 3์ฅ. ์ฌ๊ท (0) | 2021.06.30 |
[Hello Coding ์๊ณ ๋ฆฌ์ฆ] 2์ฅ. ์ ํ ์ ๋ ฌ (0) | 2021.06.30 |
[Hello Coding ์๊ณ ๋ฆฌ์ฆ] 1์ฅ. ์๊ณ ๋ฆฌ์ฆ์ ์๊ฐ (0) | 2021.06.28 |
ํ๋ก๊ทธ๋๋จธ์ค Lv1 - ์์ฐ์ ๋ค์ง์ด ๋ฐฐ์ด๋ก ๋ง๋ค๊ธฐ (0) | 2021.06.24 |