반응형
문제)
2750번: 수 정렬하기
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
www.acmicpc.net
알고리즘)
[알고리즘] 퀵 정렬 (Quick Sort)
퀵 정렬(Quick Sort)은 이름 그대로 정렬을 빠르게 하는 알고리즘이다. 그러나 버블정렬에 비해 빠를 뿐, 이름만큼 가장 빠른 정렬 알고리즘은 아니다. 퀵 정렬(Quick Sort) 알고리즘이란? 정렬 알고리
lordofkangs.tistory.com
위 개념은 JAVA언어로 구현되어 있는데 파이썬 언어로 바꾸어 실행한 결과, 메모리초과가 발생했다. 원인은 파악하는 중이다. 그래서 원리는 같지만 조금 다른 방식으로 코드를 구현해보았다.
피벗을 맨좌측 0으로 두었고 왼쪽리스트와 오른쪽리스트를 생성하여 재귀호출로 진행했다. 리스트 속 아이템 개수가 한 개 이하가 되면 종료된다. 오히려 이 방법이 직관적이고 좋다.
코드)
- 일반적인 풀이
# BOJ 재귀호출 깊이가 1000이 한계이므로 재귀호출 깊이 늘려주기
import sys
sys.setrecursionlimit(10**6)
# 입력받기
n = int(input())
inputList = []
for i in range(n) :
inputList.append(int(input()))
# 퀵소트 함수
def quickSort(tmpList) :
# 더 이상 정렬할 값이 없는 경우
if len(tmpList) <= 1 :
return tmpList
pivot = tmpList[0] # 피벗
left, right = [], [] # 왼쪽, 오른쪽 리스트 생성
for item in tmpList[1:] :
if item < pivot : left.append(item) # pivot보다 작은 경우, left에 삽입
else : right.append(item) # pivot보다 큰 경우, right에 삽입
return quickSort(left) + [pivot] + quickSort(right) # 반환
# 퀵소트 함수 호출
resultList = quickSort(inputList)
#출력
for i in range(n) :
print(resultList[i])
- 파이썬 문법을 활용한 풀이
# BOJ 재귀호출 깊이가 1000이 한계이므로 재귀호출 깊이 늘려주기
import sys
sys.setrecursionlimit(10**6)
# 입력받기
n = int(input())
inputList = []
for i in range(n) :
inputList.append(int(input()))
# 퀵소트 함수
def quickSort(tmpList) :
# 더 이상 정렬할 값이 없는 경우
if len(tmpList) <= 1 :
return tmpList
pivot = tmpList[0] # 피벗
#파이썬에서 가능한 리스트 생성 방법
left = [ item for item in tmpList[1:] if item < pivot]
right = [ item for item in tmpList[1:] if item > pivot]
return quickSort(left) + [pivot] + quickSort(right) # 반환
# 퀵소트 함수 호출
resultList = quickSort(inputList)
#출력
for i in range(n) :
print(resultList[i])
참고자료
[Python] Quick sort. 파이썬에서 간단히 퀵 정렬 구현
퀵 정렬은 이름에서 알 수 있듯이 정렬 알고리즘 중 속도가 빠른 알고리즘이다. 이해가 쉽고 간단한 정렬 알고리즘인 선택 정렬과 삽입 정렬의 시간 복잡도가 O(N^2) 인 것에 비해 퀵 정렬의 평균
latte-is-horse.tistory.com
반응형
'문제풀이 > Sorting' 카테고리의 다른 글
[python] 백준 2750번 수 정렬하기1 : 힙정렬(heap sort) (0) | 2023.04.08 |
---|---|
[python] 백준 2750번 수 정렬하기1 : 병합정렬(merge sort) (0) | 2023.04.07 |
[python] 백준 2750번 수 정렬하기1 : 버블 정렬(BubbleSort) 향상시키기 (0) | 2023.04.05 |
[JAVA] 백준 10814번 나이순 정렬 : 단어정렬 (0) | 2021.09.07 |
[JAVA] 백준 11650번 좌표 정렬하기 : 이차원 배열 (0) | 2021.08.16 |