DEV/알고리즘 문제 풀이

알고리즘 다시 공부하기 3일차

krokerdile 2022. 9. 12. 03:53
728x90

정렬 알고리즘

→ 도출하는 결과는 같더라도 알고리즘에 따라 성능과 효율이 달라지기 때문에 작동원리와 장단점 파악 필요

  알고리즘 문제 풀 때 + 코딩테스트 문제 풀 때 기본적으로 자주 사용하게 되는 요소가 아닌가 싶음

  • 버블 정렬
  • 삽입 정렬
  • 병합 정렬
  • 셸 정렬
  • 선택 정렬

→ 평소에 안썼던 정렬들이 더 많은 거 같음.

⇒ 파이썬은 느리다는 단점이 있어서 퀵 정렬을 쓰는게 좋다고 배웠는데 내용들 보면서 봤을 땐 병합 정렬이 좋을 수도 있겠단 생각이 들었음(+ 연결리스트?)

*파이썬에서 변수 편하게 바꾸기

→ a, b = b, a (양쪽 값을 편하게 바꿀 수 있음, 평소에 temp 써서 임시로 담아두는거 안해둬도 됨!)

1. 버블 정렬

가장 간편하지만 속도가 가장 느린 알고리즘, 가장 큰 값을 반복적으로 옮겨서 정렬 해줌

최악의 경우 시간복잡도가 O(n^2)까지 올라갈 수 있으므로 최대한 작은 데이터셋에 사용

  • 작동 원리 : 패스라는 과정을 반복함. 작은 값 부터 큰 값으로 정렬하려고 할 때 제일 큰 값을 리스트의 맨 오른쪽으로 보는내는 것을 통해서 리스트를 정렬하게 됨
  • 정렬 할 때 서로 붙어 있는 이웃끼리 값을 비교 해서 더 크다면, 큰 값을 작은 값과 바꿔주고 오른쪽으로 한 칸 이동하게 됨.
list = [25, 22, 21, 24, 23, 27, 26]
lastEle = len(list)-1

for i in range(lastEle):
		if list[i] > list[i+1]:
				list[i], list[i+1] = list[i+1], list[i]

→ 패스라는 과정을 한번 하게 해주는 경우

def bubbleSort(list):
	lastEle = len(list)-1
	for i in range(lastEle, 0, -1):
		for j in range(i):
			if list[j] > list[j+1]
				list[j], list[j+1] = list[j+1], list[j]

→ 두 개의 루프를 통해서 가장 높은 값을 오른쪽으로 이동시키는 과정을 반복해줌

→ 루프 두개의 중첩으로 인해 최악의 경우 O(n^2)으로 시간복잡도가 나타날 수 있음

2. 삽입 정렬

자료 구조에서 데이터 포인트를 하나씩 빼내어 올바른 위치에 집어넣는 과정을 반복하는 것

→ 참고용 gif 인데, 흠… 역시 직접 짜봐야 제일 이해가 잘 되는 거 같다.

def insertionSort(list):
		for i in range(1, len(list)):
				j = i-1
				nextEle = list[i]
				while(list[j] > nextEle) and (j>=0):
						list[j+1] = list[j]
						j = j - 1
				list[j+1] = nextEle
		return list
25 26 22 24 27 23 21
[25, 26, 26, 24, 27, 23, 21]
[25, 25, 26, 24, 27, 23, 21]
[22, 25, 26, 26, 27, 23, 21]
[22, 25, 25, 26, 27, 23, 21]
[22, 24, 25, 26, 27, 27, 21]
[22, 24, 25, 26, 26, 27, 21]
[22, 24, 25, 25, 26, 27, 21]
[22, 24, 24, 25, 26, 27, 21]
[22, 23, 24, 25, 26, 27, 27]
[22, 23, 24, 25, 26, 26, 27]
[22, 23, 24, 25, 25, 26, 27]
[22, 23, 24, 24, 25, 26, 27]
[22, 23, 23, 24, 25, 26, 27]
[22, 22, 23, 24, 25, 26, 27]
[21, 22, 23, 24, 25, 26, 27]

→ 실행 되어지는 과정

⇒리스트 전체를 순회하면서 조건을 만족하면 다음 요소의 위치에 현재 요소를 삽입 해주고 자리를 뺏긴 다음 요소는 while문이 끝나기 전에 위치를 재조정 하여 주는 방식

이라고는 하는데 말이 참 어려운 거 같다. 결국에는 그냥 맨 처음 자리부터 뒤쪽으로 하나씩 비교를 하여주고 비교를 할 때는 첫자리부터 하나씩 비교를 하여주는식으로 해주면…? 만약에 역순으로 리스트 자리가 배치되어져 있는 경우에는 시간 복잡도가 O(n^2)으로 걸려서 데이터 셋이 크면 터지는 결말을 맞지 않을까 싶음.

*추가작성 예정

728x90