๋ถํ ์ ๋ณต๋ฒ(Divide and Conquer)์ ํฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฌธ์ ๋ฅผ ์๊ณ ๋ ๋ฆฝ์ ์ธ ๋ถ๋ถ์ผ๋ก ๋๋ ํ, ์ด๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ํด๊ฒฐํ ๊ฒฐ๊ณผ๋ฅผ ํฉ์ณ์ ์ ์ฒด ๋ฌธ์ ์ ํด๋ต์ ์ป๋ ๋ฐฉ์์ ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ฃผ๋ก ์ฌ๊ท(Recursion)๋ฅผ ํ์ฉํ๋ฉฐ, ๋ณต์กํ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋์ด ๋ฐ๋ณต์ ์ผ๋ก ํด๊ฒฐํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค. ๐ค
ํต์ ๋ ฌ(Quick Sort)์ ๋ถํ ์ ๋ณต๋ฒ์ ์ฌ์ฉํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ ๋๋ค. ๋ฆฌ์คํธ๋ฅผ ๊ธฐ์ค์ (pivot)์ ์ค์ฌ์ผ๋ก ๋ ๋ถ๋ถ์ผ๋ก ๋๋ ๋ค, ๊ฐ ๋ถ๋ถ์์ ์ฌ๊ท์ ์ผ๋ก ์ ๋ ฌ์ ์ํํ๋ ๋ฐฉ์์ ๋๋ค. ๐ช ํต์ ๋ ฌ์ ํ๊ท ์ ์ผ๋ก ์๊ฐ๋ณต์ก๋ (O(n \log n))์ ๊ฐ์ง๋ฉฐ, ๊ณต๊ฐ์ ์ ์ฝํ๋ ํน์ง์ด ์์ด ํจ์จ์ ์ ๋๋ค.
def quick_sort(arr):
if len(arr) <= 1: # ๊ธฐ๋ณธ ์กฐ๊ฑด: ์์๊ฐ 1๊ฐ ์ดํ์ผ ๋
return arr
pivot = arr[len(arr) // 2] # ์ค์๊ฐ์ ํผ๋ฒ์ผ๋ก ์ ํ
left = [x for x in arr if x < pivot] # ํผ๋ฒ๋ณด๋ค ์์ ์์๋ค
middle = [x for x in arr if x == pivot] # ํผ๋ฒ๊ณผ ๊ฐ์ ์์๋ค
right = [x for x in arr if x > pivot] # ํผ๋ฒ๋ณด๋ค ํฐ ์์๋ค
return quick_sort(left) + middle + quick_sort(right) # ์ ๋ ฌํ์ฌ ๋ณํฉ
ํต์ ๋ ฌ์ ๋ถํ ์ ๋ณต๋ฒ์ ์ ํ์ ์ธ ์๋ก, ํฐ ๋ฌธ์ ๋ฅผ ์์ ๋ฌธ์ ๋ก ๋๋์ด ํจ์จ์ ์ผ๋ก ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ๋ถํ ์ ๋ณต๋ฒ์ ํต์ ๋ ฌ๋ฟ๋ง ์๋๋ผ ๋ค์ํ ๋ฌธ์ ์์ ์์ฉ๋ ์ ์์ผ๋ฉฐ, ๋ฌธ์ ํด๊ฒฐ์ ๊ฐ๋ ฅํ ๋๊ตฌ๊ฐ ๋ฉ๋๋ค. ๐
๐ก Tip: ํต์ ๋ ฌ์ ๋์ฑ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ค๋ฉด ํผ๋ฒ ์ ํ์ ์ ๋ต์ ์ผ๋ก ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.