์ ๋ ฌ
๋ฐ์ดํฐ๋ฅผ ํน์ ํ ๊ธฐ์ค์ ๋ฐ๋ผ์ ์์๋๋ก ๋์ดํ๋ ๊ฒ
์ ํ ์ ๋ ฌ
: ๊ฐ์ฅ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด ๋งจ ์์ ์๋ ๋ฐ์ดํฐ์ ๋ฐ๊พธ๊ณ , ๊ทธ๋ค์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ํํด ์์์ ๋ ๋ฒ์งธ ๋ฐ์ดํฐ์ ๋ฐ๊พธ๋ ๊ณผ์ ์ ๋ฐ๋ณต
-> ๋งค๋ฒ '๊ฐ์ฅ ์์ ๊ฒ์ ์ ํ'
- ์๊ฐ๋ณต์ก๋ O(N^2)
ใด ์ฐ์ฐํ์: N + (N-1) + (N-2) + ··· 2 → N*(N+1)/2 → O(N^2)
ใด ์์ค์ฝ๋: 2์ค ๋ฐ๋ณต๋ฌธ ์ฌ์ฉ
# ์ ํ ์ ๋ ฌ
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] # swap
print(array)
์ฝ์ ์ ๋ ฌ
- ์ ํ ์ ๋ ฌ์ ํ์ฌ ๋ฐ์ดํฐ์ ์ํ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ๋ชจ๋ ์์๋ฅผ ๋น๊ตํ๊ณ ์์น๋ฅผ ๋ฐ๊พธ๋ ๋ฐฉ๋ฉด ์ฝ์ ์ ๋ ฌ์ ํ์ํ ๋๋ง ์์น๋ฅผ ๋ฐ๊พผ๋ค.
- ํน์ ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ ํ ์์น์ '์ฝ์ 'ํ๋ค.
์ ๋ ฌ๋์ด ์๋ ๋ฐ์ดํฐ ๋ฆฌ์คํธ์์ ์ ์ ํ ์์น๋ฅผ ์ฐพ์ ๋ค์, ๊ทธ ์์น์ ์ฝ์ ๋๋ค.
- ์๊ฐ ๋ณต์ก๋ O(N^2)
ใด ํ์ฌ ๋ฆฌ์คํธ์ ๋ฐ์ดํฐ๊ฐ ๊ฑฐ์ ์ ๋ ฌ๋์ด ์๋ ์ํ๋ผ๋ฉด ๋งค์ฐ ๋น ๋ฅด๊ฒ ๋์ O(N)
- ์ ๋ ฌ์ด ์ด๋ฃจ์ด์ง ์์๋ ํญ์ ์ค๋ฆ์ฐจ์์ ์ ์ง
-> ์ฝ์ ์ ๋ ฌ์์๋ ํน์ ํ ๋ฐ์ดํฐ๊ฐ ์ฝ์ ๋ ์์น๋ฅผ ์ ์ ํ ๋,
์ฝ์ ๋ ๋ฐ์ดํฐ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ฉด ๊ทธ ์์น์์ ๋ฉ์ถ๋ฉด ๋๋ค.
# ์ฝ์
์ ๋ ฌ
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๊น์ง ๊ฐ์ํ๋ฉฐ ๋ฐ๋ณตํ๋ ๋ฌธ๋ฒ
if array[j] < array[j-1]: # ํ ์นธ์ฉ ์ผ์ชฝ์ผ๋ก ์ด๋
array[j], array[j-1] = array[j-1], array[j]
else: # ์๊ธฐ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ฉด ๊ทธ ์์น์์ ๋ฉ์ถค
break
print(array)
ํต ์ ๋ ฌ
- ๊ธฐ์ค์ ์ค์ ํ ๋ค์ ํฐ ์์ ์์ ์๋ฅผ ๊ตํํ ํ ๋ฆฌ์คํธ๋ฅผ ๋ฐ์ผ๋ก ๋๋๋ ๋ฐฉ์์ผ๋ก ๋์
- ํผ๋ฒ(๊ตํํ๊ธฐ ์ํ ๊ธฐ์ค) ์ค์
→ ์ผ์ชฝ๋ถํฐ ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๊ณ , ์ค๋ฅธ์ชฝ๋ถํฐ ํผ๋ฒ๋ณด๋ค ์์ ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ค.
→ ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ์์น๋ฅผ ์๋ก ๊ตํํด์ค๋ค.
→ ์ด๋ฌํ ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด 'ํผ๋ฒ'์ ๋ํ์ฌ ์ ๋ ฌ์ด ์ํ๋๋ค.
- ์๊ฐ ๋ณต์ก๋ O(NlogN)
ใด ํผ๋ฒ์ ๋ฆฌ์คํธ์ ๊ฐ์ฅ ์ผ์ชฝ ๋ฐ์ดํฐ๋ก ์ผ์ ๋
'์ด๋ฏธ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์๋ ๊ฒฝ์ฐ'์๋ O(N^2)
- ํน์ ํ ๋ฆฌ์คํธ์์ ํผ๋ฒ์ ์ค์ ํ์ฌ ์ ๋ ฌ์ ์ํํ ์ดํ์,
ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ๋ฆฌ์คํธ์ ์ค๋ฅธ์ชฝ ๋ฆฌ์คํธ์์ ๊ฐ๊ฐ ๋ค์ ์ ๋ ฌ์ ์ํ
- '์ฌ๊ท ํจ์'์ ๋์ ์๋ฆฌ๊ฐ ๊ฐ๋ค.
ใด ์ข ๋ฃ ์กฐ๊ฑด: ํ์ฌ ๋ฆฌ์คํธ์ ๋ฐ์ดํฐ ๊ฐ์๊ฐ 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[right] >= 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)
# ํ์ด์ฌ์ ์ฅ์ ์ ์ด๋ฆฐ ํต ์ ๋ ฌ
# ํผ๋ฒ๊ณผ ๋ฐ์ดํฐ๋ฅผ ๋น๊ตํ๋ ๋น๊ต ์ฐ์ฐ ํ์๊ฐ ์ฆ๊ฐํ๋ฏ๋ก ์๊ฐ ๋ฉด์์๋ ์กฐ๊ธ ๋นํจ์จ์ ์ด๋ค.
# ํ์ง๋ง ๋ ์ง๊ด์ ์ด๊ณ ๊ธฐ์ตํ๊ธฐ ์ฝ๋ค๋ ์ฅ์ ์ด ์๋ค.
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))
๊ณ์ ์ ๋ ฌ
- ๋น๊ต ๊ธฐ๋ฐ์ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด ์๋.
- ํน์ ํ ์กฐ๊ฑด์ด ๋ถํฉํ ๋๋ง ์ฌ์ฉํ ์ ์์ง๋ง ๋งค์ฐ ๋น ๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- '๋ฐ์ดํฐ์ ํฌ๊ธฐ ๋ฒ์๊ฐ ์ ํ๋์ด ์ ์ ํํ๋ก ํํํ ์ ์์ ๋'๋ง ์ฌ์ฉ
- '๋ชจ๋ ๋ฒ์๋ฅผ ๋ด์ ์ ์๋ ํฌ๊ธฐ์ ๋ฆฌ์คํธ(๋ฐฐ์ด)๋ฅผ ์ ์ธ'ํด์ผ ํจ.
- ๋ณ๋์ ๋ฆฌ์คํธ๋ฅผ ์ ์ธํ๊ณ ๊ทธ ์์ ์ ๋ ฌ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋๋ค.
- ์๊ฐ ๋ณต์ก๋ O(N+K)
ใด ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ์์ ์ ์์ธ ์ํฉ์์ ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ 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=' ') # ๋์ด์ฐ๊ธฐ๋ฅผ ๊ตฌ๋ถ์ผ๋ก ๋ฑ์ฅํ ํ์๋งํผ ์ธ๋ฑ์ค ์ถ๋ ฅ
์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
(1) sorted()
- ํต ์ ๋ ฌ๊ณผ ๋์ ๋ฐฉ์์ด ๋น์ทํ ๋ณํฉ ์ ๋ ฌ์ ๊ธฐ๋ฐ์ผ๋ก ๋ง๋ค์ด์ง.
- ์ผ๋ฐ์ ์ผ๋ก ํต ์ ๋ ฌ๋ณด๋ค ๋๋ฆฌ์ง๋ง ์ต์ ์ ๊ฒฝ์ฐ์๋ O(NlogN) ๋ณด์ฅ
- ๋ฆฌ์คํธ, ๋์ ๋๋ฆฌ ์๋ฃํ ๋ฑ์ ์ ๋ ฅ๋ฐ์์ ์ ๋ ฌ๋ ๊ฒฐ๊ณผ ์ถ๋ ฅ
- ๋ฐํ๋๋ ๊ฒฐ๊ณผ๋ ๋ฆฌ์คํธ ์๋ฃํ
(2) sort()
- ๋ฆฌ์คํธ ๊ฐ์ฒด์ ๋ด์ฅ ํจ์
- ๋ฆฌ์คํธ ๋ณ์๊ฐ ํ๋ ์์ ๋ ๋ด๋ถ ์์๋ฅผ ๋ฐ๋ก ์ ๋ ฌ
- ๋ณ๋์ ์ ๋ ฌ๋ ๋ฆฌ์คํธ๊ฐ ๋ฐํ๋์ง ์๊ณ ๋ด๋ถ ์์๊ฐ ๋ฐ๋ก ์ ๋ ฌ๋จ.
# ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
array = [7, 5, 9, 0, 3, 1, 6, 2, 4, 8]
result = sorted(array) # sorted()
print(result)
print(array)
array.sort() # sort()
print(array)
- sorted()๋ sort()๋ฅผ ์ด์ฉํ ๋์๋ key ๋งค๊ฐ๋ณ์๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ์ ์ ์๋ค.
- key ๊ฐ์ผ๋ก๋ ํ๋์ ํจ์๊ฐ ๋ค์ด๊ฐ์ผ ํ๋ฉฐ ์ด๋ ์ ๋ ฌ ๊ธฐ์ค์ด ๋๋ค.
- ํน์ ๋๋ค(lambda) ํจ์๋ฅผ ์ฌ์ฉํ ์๋ ์๋ค.
# ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ key๋ฅผ ํ์ฉ
array = [('๋ฐ๋๋', 2), ('์ฌ๊ณผ', 5), ('๋น๊ทผ', 3)]
def setting(data):
return data[1]
result = sorted(array, key=setting)
print(result)
์ค์ ๋ฌธ์ 1. ์์์ ์๋๋ก
# ์ ๋ ฌ
# ์ค์ ๋ฌธ์ 1. ์์์ ์๋๋ก
n = int(input())
num = []
for i in range(n):
num.append(int(input()))
num.sort(reverse=1)
for i in num:
print(i, end=' ')
- ์์ ๊ฐ์๊ฐ 500๊ฐ ์ดํ๋ก ๋งค์ฐ ์ ์ผ๋ฉฐ, ๋ชจ๋ ์๋ 1 ์ด์ 100,000 ์ดํ์ด๋ฏ๋ก ์ด๋ ํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํด๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
- ์ด๋ ํ ์ ๋ ฌ์ ์ด์ฉํด๋ ์๊ด์์ง๋ง ๊ฐ์ฅ ์ฝ๋๊ฐ ๊ฐ๊ฒฐํด์ง๋ ํ์ด์ฌ์ ๊ธฐ๋ณธ ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ด๋ค.
์ค์ ๋ฌธ์ 2. ์ฑ์ ์ด ๋ฎ์ ์์๋ก ํ์ ์ถ๋ ฅํ๊ธฐ
- ๋ด ์ฝ๋: key๋ฅผ ์ด์ฉํ์ฌ ์ ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ๋ grade ํจ์ ๋ง๋ฆ.
# ์ ๋ ฌ
# ์ค์ ๋ฌธ์ 2. ์ฑ์ ์ด ๋ฎ์ ์์๋ก ํ์ ์ถ๋ ฅํ๊ธฐ
n = int(input())
info = []
for i in range(n):
a, b = input().split()
info.append((a, int(b)))
def grade(info):
return info[1]
info.sort(key=grade)
for i in info:
print(i[0], end=' ')
- ๊ต์ฌ ์ฝ๋: ํ์ ์ ๋ณด๋ฅผ ์ ๋ ฅ๋ฐ์ ๋ ๋ฆฌ์คํธ ์ฌ์ฉํด์ ์ธ๋ฑ์ฑํจ.
key๋ฅผ ์ด์ฉํ์ฌ ์ ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ๋ lambda ํจ์ ์ด์ฉ
# ์ ๋ ฌ
# ์ค์ ๋ฌธ์ 2. ์ฑ์ ์ด ๋ฎ์ ์์๋ก ํ์ ์ถ๋ ฅํ๊ธฐ
# ๊ต์ฌ ์ฝ๋
n = int(input())
array = []
for i in range(n):
input_data = input().split()
array.append((input_data[0], int(input_data[1])))
array = sorted(array, key=lambda student:student[1])
for student in array:
print(student[0], end=' ')
์ค์ ๋ฌธ์ 3. ๋ ๋ฐฐ์ด์ ์์ ๊ต์ฒด
# ์ ๋ ฌ
# ์ค์ ๋ฌธ์ 3. ๋ ๋ฐฐ์ด์ ์์ ๊ต์ฒด
n, k = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
a.sort()
b.sort(reverse=1)
for i in range(k):
if a[i] < b[i]:
a[i], b[i] = b[i], a[i]
else:
break
print(sum(a))
- a์ ๊ฐ์ฅ ์์ ์์๋ฅผ ์ต๋ k๊ฐ ๊ณจ๋ผ์ b์ ๊ฐ์ฅ ํฐ ์์๋ค๋ก ๋ฐ๊ฟ์ฃผ๋ฉด ๋๋ค.
- ๋ฐ๋ผ์ a๋ ์ค๋ฆ์ฐจ์ ์ ๋ ฌ, b๋ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
- ์ด๋ ์์์๋ถํฐ ์ฐจ๋ก๋๋ก ๊ฐ ๋ฐฐ์ด์ ์์๋ฅผ ๋น๊ตํด์ b์ ์์๊ฐ ๋ ํฌ๋ฉด ๋ฐ๊ฟ์น๊ธฐ ํด์ฃผ๋ฉด ๋จ.
'๐ค > ์๊ณ ๋ฆฌ์ฆ ์ ๋ฆฌ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋์ ๊ณํ๋ฒ (Dynamic Programming) (0) | 2022.03.21 |
---|---|
์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ (Binary Search Algorithm) (0) | 2022.02.10 |
DFS / BFS (๊น์ด์ฐ์ ํ์ / ๋๋น์ฐ์ ํ์) (0) | 2022.01.28 |
๊ตฌํ ์๊ณ ๋ฆฌ์ฆ (Implementation Algorithm) (0) | 2022.01.26 |
๊ทธ๋ฆฌ๋ ์๊ณ ๋ฆฌ์ฆ (Greedy Algorithm) (0) | 2021.09.23 |