1. 개요
오늘은 어제 쉽게 설명한 선택 정렬 알고리즘을 더 효율적으로 구현하는 방법에 대해 고민해보았고,
삽입 정렬 알고리즘 문제를 풀이하였다.
2. 문제
1) 일반적인 선택 정렬 알고리즘
어제 쉽게 구현한 선택 정렬 알고리즘을 효율적으로 구현할 수 있는 일반적인 알고리즘을 구현해 보자.
리스트 a를 매개 변수로 받아 자료 값중 가장 최솟값을 차례대로 정렬해주는 함수 sel_sort를 작성하라.
풀이
일반적인 선택 정렬 알고리즘은 입력으로 주어진 리스트 a안에서 직접 자료의 위치를 정렬시키는 알고리즘이다.
처리할 대상 범위에서 최솟값을 찾아 그 값과 범위의 맨 앞에 있는 값을 서로 바꾸는 과정을 반복한다.
이 과정이 한 번 끝날 때마다 범위 안의 맨 앞에 있는 값은 정렬이 끝난 것이므로 정렬 대상 범위에서 제외한다.
def sel_sort(a):
n = len(a)
for i in range(n - 1):
min_index = i
for j in range(i + 1, n):
if a[j] < a[min_index]:
min_index = j
a[i], a[min_index] = a[min_index], a[i]
# 예시 사용
d = [2, 4, 5, 1, 3]
sel_sort(d)
print(d) # 출력 결과: [1, 2, 3, 4, 5]
2) 쉽게 설명한 삽입 정렬 알고리즘
리스트 a를 매개 변수로 입력 받아 삽입 정렬을 하여 리스트 result에 저장하여 반환하는 함수 ins_sort를 작성해라.
풀이
# 리스트 r에서 v가 들어가야 할 위치를 돌려주는 함수
def find_ins_idx(r, v):
# 이미 정렬된 리스트 r의 자료를 앞에서부터 차례로 확인하여
for i in range(0, len(r)):
# v 값보다 i번 위치에 있는 자료 값이 크면
# v가 그 값 바로 앞에 놓여야 정렬 순서가 유지됨
if v < r[i]:
return i
# 적절한 위치를 못 찾았을 때는
# v가 r의 모든 자료보다 크다는 뜻이므로 맨 뒤에 삽입
return len(r)
# 리스트 a를 매개 변수로 입력 받아 삽입 정렬을 하여 리스트 result에 저장하여 반환하는 함수
def ins_sort(a):
result = [] # 정렬된 결과를 저장할 리스트
for value in a:
insert_idx = find_ins_idx(result, value) # 현재 값이 삽입될 위치 찾기
result.insert(insert_idx, value) # 값 삽입
return result
d = [2, 4, 5, 1, 3]
print(ins_sort(d))
1. 리스트 a에 아직 자료가 남아 있다면 → while a:
2. 남은 자료 중에 맨 앞의 값을 뽑아내기 → value = a.pop(0)
3. 그 값이 result의 어느 위치에 들어가면 적당할지 알아내기→ ins_idx = find_ins_idx(result, value)
4. 3번 과정에서 찾아낸 위치에 뽑아낸 값을 삽입 → result.insert(ins_idx, value)
5. 1번 과정으로 돌아가 자료가 없을 때까지 반복
'기타 > 엘카데미' 카테고리의 다른 글
[엘카데미 챌린지] 20일차 파이썬 알고리즘 (7) (0) | 2023.08.06 |
---|---|
[엘카데미 챌린지] 19일차 파이썬 알고리즘 (6) (0) | 2023.08.05 |
[엘카데미 챌린지] 17일차 파이썬 알고리즘 (4) (0) | 2023.08.03 |
[엘카데미 챌린지] 16일차 파이썬 알고리즘 (3) (0) | 2023.08.02 |
[엘카데미 챌린지] 15일차 파이썬 알고리즘 (2) (0) | 2023.07.31 |