๐ ๋ณธ ํฌ์คํ ์ ๋ด์ฉ์ ๋๋๋น๋์ [์ด๊ฒ์ด ์ทจ์ ์ ์ํ ์ฝ๋ฉํ ์คํธ๋ค] ์ ํ๋ธ ๊ฐ์๋ฅผ ์๊ฐ ํ ์ ๋ฆฌํ ๋ด์ฉ์ ๊ธฐ๋กํ ๊ธ๋ก, ๋ชจ๋ ์ฌ์ง๊ณผ ์๋ฃ์ ์ถ์ฒ๋ ํด๋น ์์์ ์์ต๋๋ค.
ํ๋ฅญํ ๊ฐ์๋ก ์ง์์ ์ ๋ฌํด ์ฃผ์ ๋๋๋น๋๊ป ๊ฐ์ฌ์ ๋ง์์ ์ ํฉ๋๋ค.
๋ชฉ์ฐจ
- ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ์ ํ ์ ๋ ฌ
- ์ฝ์ ์ ๋ ฌ
- ํต ์ ๋ ฌ
- ๊ณ์ ์ ๋ ฌ
- ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๋น๊ตํ๊ธฐ
- ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์์
์ ํ ์ ๋ ฌ
- ์ฒ๋ฆฌ๋์ง ์์ ๋ฐ์ดํฐ ์ค์์ ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด ๋งจ ์์ ์๋ ๋ฐ์ดํฐ์ ๋ฐ๊พธ๋ ๊ฒ์ ๋ฐ๋ณต
์ ํ ์ ๋ ฌ ๋์ ์์
์ ํ ์ ๋ ฌ์ ๋ฐ๋ณต์๋ง๋ค ํ์ ๋ฒ์๊ฐ ์ค์ด๋ญ๋๋ค.
์ ํ ์ ๋ ฌ ์ฝ๋
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
for i in range(len(array)):
min_index = i # ๊ฐ์ฅ ์์ ์์์ ์ธ๋ฑ์ค
for j in range(i+1, len(array)):
if array[min_index] > array[j]:
min_index=j
array[i], array[min_index] = array[min_index], array[i] # ์ค์ํ
print(array)
# ์คํ๊ฒฐ๊ณผ : [0,1,2,3,4,5,6,7,8,9]
์ ํ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋
- ์ ํ์ ๋ ฌ์ N๋ฒ ๋งํผ ๊ฐ์ฅ ์์ ์๋ฅผ ์ฐพ์์ ๋งจ ์์ผ๋ก ๋ณด๋ด์ผ ํฉ๋๋ค.
- ๊ตฌํ ๋ฐฉ์์ ๋ฐ๋ผ ์ฌ์ํ ์ค์ฐจ๋ ์์ ์ ์์ง๋ง, ์ ์ฒด ์ฐ์ฐ ํ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- N + ( N - 1 ) + ( N - 2 ) + … + 2
- ์ด๋ ( N^2 + N - 2 ) / 2 ๋ก ํํ ํ ์ ์์ผ๋ฉฐ, ๋น ์ค ํ๊ธฐ๋ฒ์ ๋ฐ๋ผ O(N^2) ์ด๋ผ๊ณ ์์ฑํฉ๋๋ค.
์ฝ์ ์ ๋ ฌ
- ์ฒ๋ฆฌ๋์ง ์์ ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ๊ณจ๋ผ ์ ์ ํ ์์น์ ์ฝ์ ํฉ๋๋ค.
- ์ ํ ์ ๋ ฌ์ ๋นํด ๊ตฌํ ๋์ด๋๊ฐ ๋์ง๋ง, ์ผ๋ฐ์ ์ผ๋ก ๋ ํจ์จ์ ์ผ๋ก ๋์ํฉ๋๋ค.
์ฝ์ ์ ๋ ฌ ๋์ ์์
์ฝ์ ์ ๋ ฌ ์ฝ๋
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
for i in range(1,len(array)):
for j in range(i, 0,-1): # ์ธ๋ฑ์ค i๋ถํฐ 1๊น์ง 1์ฉ ๊ฐ์ํ๋ฉฐ ๋ฐ๋ณตํ๋ ๋ฌธ๋ฒ
if array[j]<array[j-1]: # ํ ์นธ์ฉ ์ผ์ชฝ์ผ๋ก ์ด๋
array[j], array[j-1] = array[j-1], array[j]
else: # ์๊ธฐ(array [j) ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ฉด ๊ทธ ์์น์์ ๋ฉ์ถค
break
print(array)
# ์คํ๊ฒฐ๊ณผ : [0,1,2,3,4,5,6,7,8,9]
์ฝ์ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋
- ์ฝ์ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ O(N^2) ์ด๋ฉฐ, ์ ํ ์ ๋ ฌ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐ๋ณต๋ฌธ์ด ๋ ๋ฒ ์ค์ฒฉ๋์ด ์ฌ์ฉ๋ฉ๋๋ค.
- ์ฝ์
์ ๋ ฌ์ ํ์ฌ ๋ฆฌ์คํธ์ ๋ฐ์ดํฐ๊ฐ ๊ฑฐ์ ์ ๋ ฌ๋์ด ์๋ ์ํ๋ผ๋ฉด ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋์ํฉ๋๋ค.
- ์ต์ ์ ๊ฒฝ์ฐ O(N)์ ์๊ฐ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
ํต ์ ๋ ฌ
- ๊ธฐ์ค ๋ฐ์ดํฐ๋ฅผ ์ค์ ํ๊ณ ๊ทธ ๊ธฐ์ค๋ณด๋ค ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
- ์ผ๋ฐ์ ์ธ ์ํฉ์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋์ ๋๋ค.
- ๋ณํฉ ์ ๋ ฌ๊ณผ ๋๋ถ์ด ๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ทผ๊ฐ์ด ๋๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
- ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํต ์ ๋ ฌ์ ์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค ๋ฐ์ดํฐ( Pivot )๋ก ์ค์ ํฉ๋๋ค
ํต ์ ๋ ฌ ๋์ ์์
์ด์ฒ๋ผ ํต์ ๋ ฌ์ด ์ํ๋๋ ๊ณผ์ ์ ์ฌ๊ท์ ์ผ๋ก ์ํ๋ฉ๋๋ค.
ํต ์ ๋ ฌ์ด ๋น ๋ฅธ ์ด์ ?
- ์ด์์ ์ธ ๊ฒฝ์ฐ ๋ถํ ์ด ์ ๋ฐ์ฉ ์ผ์ด๋๋ค๋ฉด ์ ์ฒด ์ฐ์ฐ ํ์๋ก O(NllogN)๋ฅผ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
- ๋๋น X ๋์ด = N x logN = NlogN
๋จ์ํ ์๊ฐํ์ ๋, ์ ์ฒด ๋ฐ์ดํฐ์ ๋ํด์ ํต์ ๋ ฌ์ ์ด์ฉํด์ ๋ฐ์ดํฐ๊ฐ ๋ฐ์ฉ ๋ถํ ๋์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค.
์ด์์ ์ธ ๊ฒฝ์ฐ ๋ฐ์ดํฐ์ ๋ฒ์๊ฐ ์ ๋ฐ์ฉ ์ค์ด๋ค๊ธฐ ๋๋ฌธ์, ์ ์ฒด ๋์ด๋ฅผ logN์ด๋ผ๊ณ ํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ , ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ N์ด๊ณ ๋์ด๊ฐ logN์ด๊ธฐ ๋๋ฌธ์ NlogN์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
- ์ต์ ์ ๊ฒฝ์ฐ O(N^2)์ ์๊ฐ๋ณต์ก๋๋ฅผ ๊ฐ์ง๋๋ค.
- ์ด์ : ์ด๋ฏธ ์ ๋ ฌ๋ ๋ฐฐ์ด์ ๋ํด ์ํํ์๋, ์ด์ค ๋ฐ๋ณต๋ฌธ ์ ์ฒด๋ฅผ ๋๋ฉฐ full-scan์ ํ๊ฒ ๋ฉ๋๋ค.
ํต ์ ๋ ฌ ์ฝ๋
1. ์ผ๋ฐ์ ์ธ ๋ฐฉ์
array = [5,7,9,0,3,1,6,2,4,8]
def quick_sort(array, start, end):
if start >= end: # ์์๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ ์ข
๋ฃ
return
pivot = start # ํผ๋ฒ์ ์ฒซ ๋ฒ์งธ ์์
left = start + 1
right = end
while(left<=right):
# ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋๊น์ง ๋ฐ๋ณต
while(left<=end and array[left]<=array[pivot]):
left += 1
# ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ์ ๋๊น์ง ๋ฐ๋ณต
while(right>start and array[tight]>=array[pivot]):
right -= 1
if(left>right): # ์๊ฐ๋ ธ๋ค๋ฉด ์์ ๋ฐ์ดํฐ์ ํผ๋ฒ์ ๊ต์ฒด
array[right], array[pivot] = array[pivot], array[right]
else: # ์๊ฐ๋ฆฌ์ง ์์๋ค๋ฉด ์์ ๋ฐ์ดํฐ์ ํฐ ๋ฐ์ดํฐ๋ฅผ ๊ต์ฒด
array[left], array[right] = array[right], array[left]
# ๋ถํ ์ดํ ์ผ์ชฝ ๋ถ๋ถ๊ณผ ์ค๋ฅธ์ชฝ ๋ถ๋ถ์์ ๊ฐ๊ฐ ์ ๋ ฌ ์ํ
quick_sort(array, start, right-1)
quick_sort(array, right+1, end)
quick_sort(array, 0, len(array)-1)
print(array)
2. ํ์ด์ฌ์ ์ฅ์ ์ ์ด๋ฆฐ ๋ฐฉ์
array = [5,7,9,0,3,1,6,2,4,8]
def quick_sort(array):
# ๋ฆฌ์คํธ๊ฐ ํ๋ ์ดํ์ ์์๋ง์ ๋ด๊ณ ์๋ค๋ฉด ์ข
๋ฃ
if len(array) <= 1:
return array
pivot = array[0] # ํผ๋ฒ์ ์ฒซ ๋ฒ์งธ ์์
tail = array[1:] # ํผ๋ฒ์ ์ ์ธํ ๋ฆฌ์คํธ
left_side = [x for x in tail if x <= pivot] # ๋ถํ ๋ ์ผ์ชฝ ๋ถ๋ถ
right_side = [x for x in tail if x > pivot] # ๋ถํ ๋ ์ค๋ฅธ์ชฝ ๋ถ๋ถ
# ๋ถํ ์ดํ ์ผ์ชฝ ๋ถ๋ถ๊ณผ ์ค๋ฅธ์ชฝ ๋ถ๋ถ์์ ๊ฐ๊ฐ ์ ๋ ฌ ์ํํ๊ณ , ์ ์ฒด ๋ฆฌ์คํธ ๋ฐํ
return quick_sort(left_side) + [pivot] + quick_sort(right_side)
print(quick_sort(array))
๊ณ์ ์ ๋ ฌ
- ํน์ ํ ์กฐ๊ฑด์ด ๋ถํฉํ ๋๋ง ์ฌ์ฉํ ์ ์์ง๋ง ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋์ํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค.
- ๊ณ์ ์ ๋ ฌ์ ๋ฐ์ดํฐ์ ํฌ๊ธฐ ๋ฒ์๊ฐ ์ ํ๋์ด ์ ์ ํํ๋ก ํํํ ์ ์์ ๋ ์ฌ์ฉ ๊ฐ๋ฅํฉ๋๋ค.
- ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ N, ๋ฐ์ดํฐ(์์) ์ค ์ต๋๊ฐ์ด K์ผ ๋ ์ต์ ์ ๊ฒฝ์ฐ์๋ ์ํ์๊ฐ O(N+K)๋ฅผ ๋ณด์ฅํฉ๋๋ค.
๊ณ์ ์ ๋ ฌ ๋์ ์์
๊ณ์ ์ ๋ ฌ ์์ค ์ฝ๋
# ๋ชจ๋ ์์์ ๊ฐ์ด 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๋ค๊ณ ๊ฐ์
array = [7,5,9,0,3,1,6,2,9,1,4,8,0,5,2]
# ๋ชจ๋ ๋ฒ์๋ฅผ ํฌํจํ๋ ๋ฆฌ์คํธ ์ ์ธ(๋ชจ๋ ๊ฐ์ 0์ผ๋ก ์ด๊ธฐํ)
count = [0]*(max(array)+1)
for i in range(len(array)):
count[array[i]] += 1 # ๊ฐ ๋ฐ์ดํฐ์ ํด๋นํ๋ ์ธ๋ฑ์ค์ ๊ฐ ์ฆ๊ฐ
for i in range(len(count)): # ๋ฆฌ์คํธ์ ๊ธฐ๋ก๋ ์ ๋ ฌ ์ ๋ณด ํ์ธ
for j in range(count[i]):
print(i, end=' ') # ๋์ด์ฐ๊ธฐ๋ฅผ ๊ตฌ๋ถ์ผ๋ก ๋ฑ์ฅํ ํ์๋งํผ ์ธ๋ฑ์ค ์ถ๋ ฅ
# [์คํ ๊ฒฐ๊ณผ] : 0 0 1 1 2 2 3 4 5 5 6 7 8 9 9
๊ณ์ ์ ๋ ฌ์ ๋ณต์ก๋ ๋ถ์
- ๊ณ์ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋์ ๊ณต๊ฐ ๋ณต์ก๋๋ ๋ชจ๋ O(N+K)์ด๋ค.
- ๊ณ์ ์ ๋ ฌ์ ๋์ ๋ฐ๋ผ์ ์ฌ๊ฐํ ๋นํจ์จ์ฑ์ ์ด๋ํ ์ ์๋ค.
- ๋ฐ์ดํฐ๊ฐ 0๊ณผ 999,999๋ก ๋จ 2๊ฐ๋ง ์กด์ฌํ๋ ๊ฒฝ์ฐ, ๋ฐฑ๋ง๊ฐ ๋งํผ์ ์์๊ฐ ๋ด๊ธธ ์ ์๋ ๋ฐฐ์ด์ ๋ง๋ค์ด์ผ ํ๋ค.
- ๊ณ์ ์ ๋ ฌ์ ๋์ผํ ๊ฐ์ ๊ฐ์ง๋ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ๊ฐ ๋ฑ์ฅํ ๋ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
- ์ฑ์ ์ ๊ฒฝ์ฐ 100์ ์ ๋ง์ ํ์์ด ์ฌ๋ฌ ๋ช ์ผ ์ ์๊ธฐ ๋๋ฌธ์ ๊ณ์ ์ ๋ ฌ์ด ํจ๊ณผ์ ์ด๋ค.
์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ๋น๊ตํ๊ธฐ
๋๋ถ๋ถ์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ์ง์ํ๋ ํ์ค ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ต์ ์ ๊ฒฝ์ฐ์๋ O(NlogN)์ ๋ณด์ฅํ๋๋ก ์ค๊ณ๋์ด ์์ต๋๋ค.
์์์ ๋ค๋ฃฌ ๋ค ๊ฐ์ง ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ๋น๊ตํ๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋ฌธ์ : ๋ ๋ฐฐ์ด์ ์์ ๊ต์ฒด
๋ด ํ์ด
n,k = map(int,input().split())
a = list(map(int,input().split()))
b = list(map(int,input().split()))
for _ in range(k):
min_a = min(a)
max_b = max(b)
a[a.index(min_a)],b[b.index(max_b)] = max_b,min_a
print(sum(a))
- K๋ฒ ๋๋ ๋ฐ๋ณต๋ฌธ
- min(a), max(b), index ์ฐ์ฐ : ๊ฐ O(n)
- O(K(n+n+n)) = O(nk)*
- ์ฆ, n๊ณผ k๊ฐ ์ต๋๊ฐ์ธ 10,000,000์ผ ๊ฒฝ์ฐ ์๊ฐ ์ ํ ๋ด์ ์ํ๋์ง ์๋๋ค.
- ๋ด๊ฐ ์ง ์ฝ๋์ ์ต์ ์ ์๊ฐ ๋ณต์ก๋๊ฐ O(10^5 * 10^5) = O(10^10)์ด๋ฏ๋ก, O(10^8) ์ฐ์ฐ์ ์ํ์ด 1์ด๋ผ ๊ฐ์ ํ ๋, ์ฝ 100์ด๊ฐ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ.
์ด์ฝํ ์ค๋ช
- ํต์ฌ ์์ด๋์ด : ๋งค๋ฒ ๋ฐฐ์ด A์์ ๊ฐ์ฅ ์์ ์์๋ฅผ ๊ณจ๋ผ์, ๋ฐฐ์ด B์์ ๊ฐ์ฅ ํฐ ์์์ ๊ต์ฒดํฉ๋๋ค.
- ๊ฐ์ฅ ๋จผ์ ๋ฐฐ์ด A์ B๊ฐ ์ฃผ์ด์ง๋ฉด A์ ๋ํ์ฌ ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ๊ณ , B์ ๋ํด ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํฉ๋๋ค.
- ์ดํ ๋ ๋ฐฐ์ด์ ์์๋ฅผ ์ฒซ ๋ฒ์จฐ ์ธ๋ฑ์ค๋ถํฐ ์ฐจ๋ก๋ก ํ์ธํ๋ฉฐ A์ ์์๊ฐ B์ ์์๋ณด๋ค ์์ ๋์๋ง ๊ต์ฒด๋ฅผ ์ํํฉ๋๋ค.
- ์ด ๋ฌธ์ ์์๋ ๋ ๋ฐฐ์ด์ ์์๊ฐ ์ต๋ 100,000๊ฐ ๊น์ง ์ ๋ ฅ๋ ์ ์์ผ๋ฏ๋ก, ์ต์ ์ ๊ฒฝ์ฐ O(NlogN)์ธ ๋ณด์ฅํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํด์ผํฉ๋๋ค.
์ด์ฝํ ํ์ด
n,k = map(int,input().split()) # N๊ณผ K๋ฅผ ์
๋ ฅ๋ฐ๊ธฐ
a = list(map(int,input().split())) # ๋ฐฐ์ด A์ ๋ชจ๋ ์์ ์
๋ ฅ๋ฐ๊ธฐ
b = list(map(int,input().split())) # ๋ฐฐ์ด B์ ๋ชจ๋ ์์ ์
๋ ฅ๋ฐ๊ธฐ
a.sort() # ๋ฐฐ์ด A๋ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ ์ํ
b.sort() # ๋ฐฐ์ด B๋ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ ์ํ
# ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ถํฐ ํ์ธํ๋ฉฐ, ๋ ๋ฐฐ์ด์ ์์๋ฅผ ์ต๋ K๋ฒ ๋น๊ต
for i in range(k):
# A์ ์์๊ฐ B์ ์์๋ณด๋ค ์์๊ฒฝ์ฐ
if a[i] < b[i]:
a[i],b[i] = b[i],a[i]
else : # A์ ์์๊ฐ B์ ์์๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ์๋, ๋ฐ๋ณต๋ฌธ์ ํ์ถ
break
print(sum(a)) # ๋ฐฐ์ด a์ ๋ชจ๋ ์์์ ํฉ์ ์ถ๋ ฅ
'Coding Test > ์ฝํ ์ด๋ก ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๊ตฌํ : ์๋ฎฌ๋ ์ด์ ๊ณผ ์์ ํ์ - ๋ฌธ์์ด ์ฌ์ ๋ ฌ (0) | 2022.10.21 |
---|---|
๊ตฌํ : ์๋ฎฌ๋ ์ด์ ๊ณผ ์์ ํ์ - ์์ค์ ๋์ดํธ (0) | 2022.10.21 |
๊ตฌํ : ์๋ฎฌ๋ ์ด์ ๊ณผ ์์ ํ์ - ์๊ฐ ๋ฌธ์ (0) | 2022.10.21 |
๊ตฌํ : ์๋ฎฌ๋ ์ด์ ๊ณผ ์์ ํ์ - ์ํ์ข์ฐ ๋ฌธ์ (0) | 2022.10.20 |
๊ทธ๋ฆฌ๋(ํ์๋ฒ) ์๊ณ ๋ฆฌ์ฆ - ๋ชจํ๊ฐ ๊ธธ๋ (0) | 2022.10.20 |