2024년 7월 27일
정렬 알고리즘 [개념]
한 줄 정리
파이썬에서 정렬은 기본적으로 오름차순이다!
- 문자열의 오름차순 정렬은 사전순(아스키코드가 낮은 순)이다!
- 배열의 원소가
(3, 4, 5)처럼 여러 개의 값이 들어 있다면, 앞에 있는 원소를 우선적으로 비교한다.
- 파이썬에서의 사용자 정렬은 key 옵션을 통해서 가능하며, 함수 형태로 어떤 값을 기준으로 정렬할 것인지 지정해 주면 된다.
1. 정렬 알고리즘
- 정렬 알고리즘이란 어떤 기준에 대해 원소들을 정렬하는 알고리즘을 의미
- 대부분의 프로그래밍 언어에선 정렬 함수를 내장 함수로 제공하고 있다.
- 오름차순과 내림차순 정렬의 경우에는 함수를 그대로 사용해도 구현할 수 있다.
- 더 복잡한 조건으로 정렬을 하기 위해서는 사용자 정렬을 해야 한다.
2. 정렬 알고리즘 종류
- 시간 복잡도
선택 정렬,삽입 정렬,버블 정렬
- 시간 복잡도
병합 정렬,퀵 정렬
3. 파이썬에서 정렬 함수
- 파이썬에서
sorted()함수 설명 - 기본적으로, 입력으로 주어진 배열에 대해 오름차순 정렬하여 새로운 리스트로 반환함.
- 리스트로 형 변환할 수 있는 객체면
sorted()함수를 사용할 수 있다고 생각해도 된다. key: 적절한 함수를 넣으면 사용자 정렬이 가능함.reverse: 이 옵션을 True로 하면 결과를 역순으로 반환함.

iterable: 리스트와 같이 순회할 수 있는 객체를 의미
# 리스트 lst = [3, 4, 5, 2, 1] print(lst) # print(list(lst)) print(sorted(lst)) print(type(sorted(lst))) print() # 튜플 tp = (3, 4, 5, 2, 1) print(tp) # print(list(tp)) print(sorted(tp)) print(type(sorted(tp))) print() # 딕셔너리 (키들을 정렬) dt = {'d': 1, 'a': 2, 'c': 3} print(dt) # print(list(dt)) print(sorted(dt)) print(type(sorted(dt))) print() # 문자열 s = "cbfABVeda31" print(s) # print(list(s)) print(sorted(s)) print(type(sorted(s))) print()
- 예제 문제1) 숫자 정렬
개의 숫자가 주어질 때, 숫자들을 오름차순으로 정렬한 결과와 내림차순으로 정렬한 결과를 출력하시오.
- 입력
-1 3 0 7 0 10 -3 7 1 8
- 출력
-3 -1 0 0 1 3 7 7 8 10 10 8 7 7 3 1 0 0 -1 -3
정답 코드
arr = list(map(int, input().split())) arr1 = sorted(arr) arr2 = sorted(arr, reverse=True) print(' '.join(map(str, arr1))) print(' '.join(map(str, arr2)))
- 예제 문제2) 문자열 정렬
개의 단어들이 주어질 때, 단어들을 사전순으로 정렬한 결과 출력하시오. 입력으로는 이 먼저 주어지며, 이어서 단어들이 줄 단위로 주어진다.
- 입력
7 banana orange blueberry pineapple apple mango strawberry
- 출력
apple banana blueberry mango orange pineapple strawberry
- 최악의 시간 복잡도: = 34,000,000(삼천사백만회) ≤ 1억
정답 코드
N = int(input()) words = [input() for _ in range(N)] words = sorted(words) for word in words: print(word)
4. 파이썬에서 사용자 정렬
- 배열에 들어 있는 원소가 여러 값을 담고 있는 경우의 정렬
- 인덱스가 낮은 값을 기준으로 정렬을 진행 ⭐
- 이때도, 기본적으로 오름차순을 기준으로 정렬 ⭐
예시 코드
arr1 = [4, 2, 3, 1, 5] print(sorted(arr1)) print() arr2 = [(2, 3), (2, 1), (1, 3), (1, -1), (3, 2)] print(sorted(arr2)) print() arr3 = [(2, 1, 1), (1, 1, 3), (1, 2, 1), (1, 1, 2)] print(sorted(arr3)) print()
sorted()함수의key옵션key옵션에는 정렬의 기준이 되는 함수가 들어간다.key옵션의 기본값은lambda x: x라고 생각할 수 있다.
예시 코드1
def comp(x): return x arr1 = [4, 2, 3, 1, 5] print(sorted(arr1)) print(sorted(arr1, key=comp)) print() arr2 = [(2, 3), (2, 1), (1, 3), (1, -1), (3, 2)] print(sorted(arr2)) print(sorted(arr2, key=comp)) print() arr3 = [(2, 1, 1), (1, 1, 3), (1, 2, 1), (1, 1, 2)] print(sorted(arr3)) print(sorted(arr3, key=comp)) print()
예시 코드2
def comp(x): return x arr1 = [4, 2, 3, 1, 5] print(sorted(arr1)) print(sorted(arr1, key=comp)) print(sorted(arr1, key=lambda x : x)) print() arr2 = [(2, 3), (2, 1), (1, 3), (1, -1), (3, 2)] print(sorted(arr2)) print(sorted(arr2, key=comp)) print(sorted(arr2, key=lambda x : x)) print() arr3 = [(2, 1, 1), (1, 1, 3), (1, 2, 1), (1, 1, 2)] print(sorted(arr3)) print(sorted(arr3, key=comp)) print(sorted(arr3, key=lambda x : x)) print()
예시 코드3
arr1 = [4, 2, 3, 1, 5] print(sorted(arr1)) print(sorted(arr1, key=lambda x : x)) # print(sorted(arr1, key=lambda x : -x)) print() arr2 = [(2, 3), (2, 1), (1, 3), (1, -1), (3, 2)] print(sorted(arr2)) print(sorted(arr2, key=lambda x : x)) # print(sorted(arr2, key=lambda x : -x)) print() arr3 = [(2, 1, 1), (1, 1, 3), (1, 2, 1), (1, 1, 2)] print(sorted(arr3)) print(sorted(arr3, key=lambda x : x)) # print(sorted(arr3, key=lambda x : -x)) print()
- 사용자 정렬하기
key옵션을 이용해서 원소의 어떤 값을 기준으로 정렬할 것인지를 설정할 수 있다.key옵션에는 함수가 들어간다.(4, 20)과(2, 20)을 비교하는 과정lambda x: (-x[1], x[0])에 두 원소를 대입하면 결과는 다음과 같다.(4, 20)→(-20, 4)(2, 20)→(-20, 2)- 이렇게
key함수를 통해 나온 결과를 기준으로 정렬하게 된다. - 따라서, 정렬 결과는
(2, 20)이(4, 20)보다 앞에 위치하게 되는 것이다.
ex1) 원소를 내림차순 정렬
lst = [3, 4, 1, 2] result = sorted(lst, key=lambda x: -x) print(result)
ex2) 인덱스 1인 값을 기준으로 내림차순, 만약 인덱스 1인 값이 같다면, 인덱스 0인 값을 기준으로 오름차순 정렬
lst = [(3, 10), (4, 20), (1, 30), (2, 20)] result = sorted(lst, key=lambda x: (-x[1], x[0])) print(result)
알아두면 좋은 내용들
정렬 관련 내용 정리
- 파이썬에서 정렬은 기본적으로 오름차순이다!
- 문자열의 오름차순 정렬은 사전순(아스키코드가 낮은 순)이다!
- 배열의 원소가
(3, 4, 5)처럼 여러 개의 값이 들어 있다면, 앞에 있는 원소를 우선적으로 비교한다.
- 파이썬에서의 사용자 정렬은 key 옵션을 통해서 가능하며, 함수 형태로 어떤 값을 기준으로 정렬할 것인지 지정해 주면 된다.
파이썬의 람다(lambda) 함수에 대하여
- 람다(lambda) 함수는 한 줄 함수이며 매개변수와 반환할 값을 쓰면 된다.
lambda arguments: expressionarguments: 함수의 매개변수expression: 함수의 반환값
예시 코드
def func1(x, y): return x + y func2 = lambda x, y: x + y print(func1(3, 4)) print(func2(3, 4))
- 람다(lambda) 함수는 언제 쓰이는가?
- 람다(lambda) 함수는 선언과 동시에 사용할 수 있으므로, 간단한 함수를 인자로 넘겨줄 때 자주 사용한다.
