데이터를 순서대로 나열하는 방법.

가장 쉽고 직관적인 정렬.
방법:
1. 배열의 처음부터 끝까지 반복
2. 현재값과 다음값을 비교했을 때 정렬이 되어있지 않다면 두 값 교환
def bubblesort(lst):
# 최댓값을 구하는 알고리즘을 len(lst) - 1 만큼 반복한다.
iters = len(lst) - 1
for iter in range(iters):
# 이미 구한 최댓값은 범위에서 제외한다.
wall = iters - iter
for cur in range(wall):
if lst[cur] > lst[cur + 1]:
lst[cur], lst[cur + 1] = lst[cur + 1], lst[cur]
return lst

선택해서 정렬하는 방식.
1. 배열의 처음부터 끝까지 반복
2. 최솟값을 찾아서 i번째와 교환
def selectionsort(lst):
iters = len(lst) - 1
for iter in range(iters):
minimun = iter
for cur in range(iter + 1, len(lst)):
if lst[cur] < lst[minimun]:
minimun = cur
if minimun != iter:
lst[minimun], lst[iter] = lst[iter], lst[minimun]
return lst

전체에서 하나씩 올바른 위치에 삽입하는 방식.
def insertionsort(lst):
# 0번째 요소는 이미 정렬되어있으니, 1번째 ~ lst(len)-1 번째를 정렬하면 된다.
for cur in range(1, len(lst)):
# 비교지점이 cur-1 ~ 0(=cur-cur)까지 내려간다.
for delta in range(1, cur + 1):
cmp = cur - delta
if lst[cmp] > lst[cmp + 1]:
lst[cmp], lst[cmp + 1] = lst[cmp + 1], lst[cmp]
else:
break
return lst
def insertionsort_2(lst):
for idx in range(1, len(lst)):
val = lst[idx]
cmp = idx - 1
while lst[cmp] > val and cmp >= 0:
lst[cmp + 1] = lst[cmp]
cmp -= 1
lst[cmp + 1] = val
return lst

분할 정복을 통해 정렬.
1. 기준 설정 (마지막 요소)
2. 기준과 비교해서 작은 집합과 큰 집합으로 나눔
3. 집합들 사이에 기준 삽입
4. 작은 집합과 큰 집합을 대상으로 재귀호출하여 정렬한 뒤 결과 합치기
def quicksort(lst, start, end):
def partition(part, ps, pe):
pivot = part[pe]
i = ps - 1
for j in range(ps, pe):
if part[j] <= pivot:
i += 1
part[i], part[j] = part[j], part[i]
part[i + 1], part[pe] = part[pe], part[i + 1]
return i + 1
if start >= end:
return None
p = partition(lst, start, end)
quicksort(lst, start, p - 1)
quicksort(lst, p + 1, end)
return lst

def merge(arr1, arr2):
result = []
i = j = 0
while i < len(arr1) and j < len(arr2):
if arr1[i] < arr2[j]:
result.append(arr1[i])
i += 1
else:
result.append(arr2[j])
j += 1
while i < len(arr1):
result.append(arr1[i])
i += 1
while j < len(arr2):
result.append(arr2[j])
j += 1
return result
def mergesort(lst):
if len(lst) <= 1:
return lst
mid = len(lst) // 2
L = lst[:mid]
R = lst[mid:]
return merge(mergesort(L), mergesort(R))

1. 기존에 구현했던 BinaryMaxHeap을 이용해 힙의 구조로 저장.
2. 힙의 요소들을 역순으로 추출하여 리스트에 저장. (BinaryMinHeap 이용 시 필요 x)
def sorted_by_heap(lst):
maxheap = BinaryMaxHeap()
for elem in lst:
maxheap.insert(elem)
desc = [maxheap.extract() for _ in range(len(lst))]
return list(reversed(desc))
구현 방법을 직접 생각하는건 어려웠지만 페어들의 설명을 듣고 바로 이해할 수 있었다.
A: 입력값들의 리스트
B: 가장 긴 증가하는 부분 수열을 담을 리스트 ([0])
D: A의 i번째 요소를 삽입할 B의 위치
N = int(input())
A = list(map(int, input().split()))[:N]
B = [0]
for i in range(N):
if A[i] > B[-1]:
B.append(A[i])
else:
for j in range(len(B)):
if B[j] >= A[i]:
B[j] = A[i]
break
print(len(B)-1)
오늘 문제 중 제일 이해하기 어려웠던 문제다.
조건:
1. 이동은 다음 계단 or 다음 다음 계단
2. 세 계단 연속 밟기 안됨
3. 마지막 계단은 반드시 밟아야 함
N: 계단의 개수
stairs: 계단 별 점수 리스트
max_value: 최대 합 리스트
N = int(input())
stairs = []
max_value = []
for i in range(N):
stairs.append(int(input()))
max_value.append(stairs[0])
if N >= 2:
max_value.append(stairs[0]+stairs[1])
if N > 3:
max_value.append(max(stairs[0]+stairs[2],stairs[1]+stairs[2]))
for i in range(3,N):
max_value.append(max(stairs[i] + stairs[i-1] + max_value[i-3],stairs[i] + max_value[i-2]))
print(max_value[-1])
오늘 문제 중 그나마 무난했던 문제다.
5주차 강의에서 동적 계획법 기법을 설명할 때 피보나치 수열을 구하는 함수를 예로 들었는데 그 방법을 적용해서 구현해보았다.
memo: a,b,c 입력들에 대한 함수 호출 값을 저장하는 21x21x21 크기의 리스트
memo = [[[0 for _ in range(21)] for _ in range(21)] for _ in range(21)]
def w(a, b, c):
if a <= 0 or b <= 0 or c <= 0:
return 1
if a > 20 or b > 20 or c > 20:
return w(20, 20, 20)
if memo[a][b][c] != 0:
return memo[a][b][c]
if a < b and b < c:
memo[a][b][c] = w(a, b, c-1) + w(a, b-1, c-1) - w(a, b-1, c)
return memo[a][b][c]
memo[a][b][c] = w(a-1, b, c) + w(a-1, b-1, c) + w(a-1, b, c-1) - w(a-1, b-1, c-1)
return memo[a][b][c]
a, b, c = 0, 0, 0
ans = 0
while True:
a, b, c = map(int, input().split())
if a == -1 and b == -1 and c == -1:
break
print(f'w({a}, {b}, {c}) = {w(a, b, c)}')