1. ๊ธฐ์ค์ ๋ฐ๋ผ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฌ
- ์ ๋ ฌ : ๋ฐ์ดํฐ๋ฅผ ํน์ ํ ๊ธฐ์ค์ ๋ฐ๋ผ ์์๋๋ก ๋์ดํ๋ ๊ฒ
์ ํ ์ ๋ ฌ
- ๋ฐ์ดํฐ๊ฐ ๋ฌด์์๋ก ์์ ๋, ๋งค๋ฒ ๊ฐ์ฅ ์์ ๊ฒ์ ์ ํํ์ฌ ์์ผ๋ก ๋ณด๋ด๋ ์๊ณ ๋ฆฌ์ฆ
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
- ์๊ฐ ๋ณต์ก๋ :
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):
if array[j] > array[j-1]:
array[j], array[j-1] = array[j-1], array[j] # swap
else: break
- ์๊ฐ ๋ณต์ก๋ :
O(N^2)
-> ์ต์ ์ ๊ฒฝ์ฐO(N)
ํต ์ ๋ ฌ
- ๊ธฐ์ค์ ์ค์ ํ ํ ๋ค์ ํฐ ์์ ์์ ์๋ฅผ ๊ตํํ ํ ๋ฆฌ์คํธ๋ฅผ ๋ฐ์ผ๋ก ๋๋๋ ์๊ณ ๋ฆฌ์ฆ
- ํต ์ ๋ ฌ์์๋ ํผ๋ด(pivot)์ด ์ฌ์ฉ๋จ => ๊ตํํ๊ธฐ ์ํ ๊ธฐ์ค
- ๋ฆฌ์คํธ์์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ํผ๋ด์ผ๋ก ์ค์ ํ๋ค.
- ์ผ์ชฝ๊ณผ ์ค๋ฅธ์ชฝ์์ ์ด๋ํ๋ฉด์ ๋ ์๋ฅผ ๋น๊ตํ ํ ํผ๋ด๋ณด๋ค ํฐ ์๋ ์ค๋ฅธ์ชฝ, ์์ ์๋ ์ผ์ชฝ์ ๋๋ค.
- ๋ ๊ฐ์ด ์๊ฐ๋ฆด ๋๋ ์์ ๋ฐ์ดํฐ์ ํผ๋ด์ ์์น๋ฅผ ์๋ก ๋ณ๊ฒฝํ๋ค.
- ๋ฆฌ์คํธ์ ๊ฐ์๊ฐ 1์ด ๋ ๋๊น์ง ์ ๋ฐฉ์์ ๋ฐ๋ณตํ๋ค.
array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]
def quick_sort(array, start, end):
if start >= end: 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]:
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(NlogN)
=> ์ต์ ์ ๊ฒฝ์ฐO(N^2)
- ์ด๋ฏธ ๋ฐ์ดํฐ๊ฐ ์ ๋ ฌ๋์ด ์๋ ๊ฒฝ์ฐ ๋งค์ฐ ๋๋ฆฌ๊ฒ ๋์ (์ฝ์ ์ ๋ ฌ๊ณผ ๋ฐ๋)
- ํ์ด์ฌ์ ๊ธฐ๋ณธ ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋
O(NlogN)
์ ๋ณด์ฅํ๋ค.
๊ณ์ ์ ๋ ฌ
- ๋ณ๋์ ๋ฆฌ์คํธ๋ฅผ ์ ์ธํ๊ณ ๊ทธ ์์ ์ ๋ ฌ์ ๋ํ ์ ๋ณด๋ฅผ ๋ด๋๋ค๋ ํน์ง
- ํน์ ํ ์กฐ๊ฑด์ด ๋ถํฉํ ๋๋ง ์ฌ์ฉํ ์ ์์ผ๋ ๋งค์ฐ ๋น ๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ
- ๋ฐ์ดํฐ์ ๊ฐ์๊ฐ N, ๋ฐ์ดํฐ ์ค ์ต๋๊ฐ์ด K์ผ ๋, ์ต์
์ ๊ฒฝ์ฐ์๋
O(N+K)
๋ฅผ ๋ณด์ฅํ๋ค. - ๋จ, ๋ฐ์ดํฐ์ ํฌ๊ธฐ ๋ฒ์๊ฐ ์ ํ ๋์ด ์ ์ํํ๋ก ํํํ ์ ์์๋๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
- ์ง์ ๋ฐ์ดํฐ์ ๊ฐ์ ๋น๊ตํ ๋ค์ ์์น๋ฅผ ๋ณ๊ฒฝํ๋ฉฐ ์ ๋ ฌํ๋ ๋ฐฉ์์ด ์๋๋ค.
- ๋จผ์ ๊ฐ์ฅ ํฐ ๋ฐ์ดํฐ์ ์์ ๋ฐ์ดํฐ์ ๋ฒ์๊ฐ ๋ชจ๋ ๋ด๊ธธ ์ ์๋ ํ๋์ ๋ฆฌ์คํธ๋ฅผ ์์ฑํ๋ค.
- ๋ฐ์ดํฐ๋ฅผ ํ๋์ฉ ํ์ธํ๋ฉฐ ๋ฐ์ดํฐ์ ๊ฐ๊ณผ ๋์ผํ ์ธ๋ฑ์ค์ ๋ฐ์ดํฐ๋ฅผ 1์ฉ ์ฆ๊ฐ์ํจ๋ค.
- ๋ฆฌ์คํธ์ ์ฒซ ๋ฒ์งธ ๋ฐ์ดํฐ๋ถํฐ ํ๋์ฉ ๊ฐ๋งํผ ์ธ๋ฑ์ค๋ฅผ ์ถ๋ ฅํ๋ค.
array = [5, 7, 9, 0, 3, 1, 6, 2, 4, 8]
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=' ')
- ์๊ฐ ๋ณต์ก๋ :
O(N+K)
- ํ์กดํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ค์์ ๊ธฐ์ ์ ๋ ฌ๊ณผ ๋๋ถ์ด ๊ฐ์ฅ ๋น ๋ฆ
- ๊ณต๊ฐ ๋ณต์ก๋ :
O(N+K)
- ๋ฆฌ์คํธ์ ํฌ๊ธฐ๊ฐ 100๋ง์ ๋์ง ์์ ๋๊ฐ ์ข๋ค.
ํ์ด์ฌ์ ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ๊ธฐ๋ณธ ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ :
sorted()
ํจ์, ๋ฆฌ์คํธ๋ฆฌ ๋์ ๋๋ฆฌ ๋ฑ์ ์ ๋ ฅ๋ฐ์์ ๋ฆฌ์คํธ๋ก ๋ฐํํจ - ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ
- ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํ ์ ์๋ ๋ฌธ์
- ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฆฌ์ ๋ํด ๋ฌผ์ด๋ณด๋ ๋ฌธ์ : ์ฌ๋ฌ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์๋ฆฌ๋ฅผ ์๊ณ ์์ด์ผ ํ๋ค
- ๋ ๋น ๋ฅธ ์ ๋ ฌ์ด ํ์ํ ๋ฌธ์ : ๊ธฐ์กด ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌ์กฐ์ ๊ฐ์ ํ์
2. ์์์ ์๋๋ก
๋์ด๋ ํ
๋ฌธ์
ํ๋์ ์์ด์ ๋ค์ํ ์๊ฐ ํฌ๊ธฐ์ ์๊ด์์ด ๋์ด๋์ด ์๋ค. ์ด ์๋ฅผ ํฐ ์๋ถํฐ ์์ ์์ ์์๋ก ์ ๋ ฌํด์ผ ํ๋ค. ์์ด์ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ ํ๋ก๊ทธ๋จ์ ๋ง๋์์ค.
ํด์ค
๊ธฐ๋ณธ์ ์ธ ์ ๋ ฌ์ ํ ์ ์๋์ง ๋ฌผ์ด๋ณด๋ ๋ฌธ์ ์ด๋ค. ๊ธฐ๋ณธ ์ ๋ ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ด์ฉํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ด๋ค.
์ฝ๋
n = int(input())
array = []
for i in range(n):
array.append(int(input()))
array = sorted(array, reverse=True)
for i in array:
print(i, end=' ')
3. ์ฑ์ ์ด ๋ฎ์ ์์๋ก ํ์ ์ถ๋ ฅํ๊ธฐ
๋์ด๋ ํ
๋ฌธ์
N๋ช ์ ํ์ ์ ๋ณด๊ฐ ์๊ณ , ํ์ ์ ๋ณด๋ ํ์์ ์ด๋ฆ๊ณผ ์ฑ์ ์ผ๋ก ๊ตฌ๋ถ๋๋ค. ๊ฐ ํ์์ ์ด๋ฆ๊ณผ ์ฑ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋ ์ฑ์ ์ด ๋ฎ์ ์์๋๋ก ํ์์ ์ด๋ฆ์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
ํด์ค
์ด ๋ฌธ์ ์์ ํ์ ์ ๋ณด๊ฐ ์ต๋ 10๋ง๊ฐ๊น์ง ์ ๋ ฅ๋๋ฏ๋ก ๊ณ์ ์ ๋ ฌ์ ์ด์ฉํ๋ฉด ๋๋ค. ์ถ๋ ฅํ ๋๋ ์ด๋ฆ๋ง ์ถ๋ ฅํ๋ฉด ๋๋ฏ๋ก ํ์์ ๋ณด๋ฅผ (์ ์, ์ด๋ฆ)์ผ๋ก ๋ฌถ์ ๋ค์ ์ ์๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ์ ์ํํด์ผ ํ๋ค.
n = int(input())
array = []
for i in range(n):
input_data = input().split()
array.append((input_data[0], input_data[1]))
array = sorted(array, key = lambda student: student[1])
for student in array:
print(student[0], end=' ')
4. ๋ ๋ฐฐ์ด์ ์์ ๊ต์ฒด
๋์ด๋ ํ
๋ฌธ์
๋ ๊ฐ์ ๋ฐฐ์ด A, B๋ N๊ฐ์ ์์๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ๋ฐฐ์ด์ ์์๋ ๋ชจ๋ ์์ฐ์์ด๋ค. ์ต๋ K๋ฒ์ ๋ฐ๊ฟ์น๊ธฐ ์ฐ์ฐ์ ์ํํ ์ ์๋๋ฐ, ๋ฐ๊ฟ์น๊ธฐ ์ฐ์ฐ์ด๋ A์ ์๋ ์์ ํ๋์ B์ ์๋ ์์ ํ๋๋ฅผ ๊ณจ๋ผ์ ๋ ์์๋ฅผ ์๋ก ๋ฐ๊พธ๋ ๊ฒ์ ๋งํ๋ค. ์ต์ข ๋ชฉํ๋ ๋ฐฐ์ด A์ ๋ชจ๋ ์์์ ํฉ์ด ์ต๋๊ฐ ๋๋๋ก ํ๋ ๊ฒ์ด๋ค.
N, K ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด A, B์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋ ์ต๋ K๋ฒ์ ๋ฐ๊ฟ์น๊ธฐ ์ฐ์ฐ์ ์ํํ์ฌ ๋ง๋ค ์ ์๋ ๋ฐฐ์ด A์ ๋ชจ๋ ์์์ ํฉ์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
ํด์ค
๋งค๋ฒ ๋ฐฐ์ด A์์ ๊ฐ์ฅ ์์ ์์๋ฅผ ๊ณจ๋ผ์ ๋ฐฐ์ด B์ ๊ฐ์ฅ ํฐ ์์์ ๊ต์ฒด๋ฅผ ํ๋ ๊ฒ์ด๋ค. ๋จ, A์ ๊ฐ์ฅ ์์ ์์๊ฐ B์ ๊ฐ์ฅ ํฐ ์์๋ณด๋ค ์์์ผ ํ๋ค. ์ด๋ฌํ ๊ณผ์ ์ K๋ฒ ๋ฐ๋ณตํ๋ค. ๋ฐ๋ผ์ A๋ ์ค๋ฆ์ฐจ์, B๋ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ ํ ์ฒซ ๋ฒ์งธ ์ธ๋ฑ์ค๋ถํฐ ๋น๊ตํ๋ฉด์ ์์ ๋ ๊ต์ฒด๋ฅผ ์ํํ๋ค. ์ต๋ ๊ฐ์๊ฐ 10๋ง๊ฐ์ด๋ฏ๋ก O(NlogN)์ ๋ณด์ฅํ๋ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ์ ์ด์ฉํ๋ค.
์ฝ๋
n, k = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))
a.sort()
b.sort(reverse=True)
for i in range(k):
if a[i] < b[i] :
a[i], b[i] = b[i], a[i]
else : break
print(sum(a))