📖 문제 설명
문제 : https://www.acmicpc.net/problem/24090
quick_sort(A[p..r]) { # A[p..r]을 오름차순 정렬한다.
if (p < r) then {
q <- partition(A, p, r); # 분할
quick_sort(A, p, q - 1); # 왼쪽 부분 배열 정렬
quick_sort(A, q + 1, r); # 오른쪽 부분 배열 정렬
}
}
partition(A[], p, r) {
x <- A[r]; # 기준원소
i <- p - 1; # i는 x보다 작거나 작은 원소들의 끝지점
for j <- p to r - 1 # j는 아직 정해지지 않은 원소들의 시작 지점
if (A[j] ≤ x) then A[++i] <-> A[j]; # i값 증가 후 A[i] <-> A[j] 교환
if (i + 1 != r) then A[i + 1] <-> A[r]; # i + 1과 r이 서로 다르면 A[i + 1]과 A[r]을 교환
return i + 1;
}
💡요구사항 분석


import sys
sys.setrecursionlimit(10000)
n, k = map(int, sys.stdin.readline().split())
arr = list(map(int, sys.stdin.readline().split()))
def partition(arr, start, end):
pivot = arr[end] # 피복은 배열 마지막으로 설정
i = start - 1 # 작은 값들을 배치할 인덱스
for j in range(start, end):
if arr[j] <= pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
arr[i + 1], arr[end] = arr[end], arr[i + 1] # 피봇 갱신
return i + 1
def quick_sort(arr, start, end):
if start < end:
mid = partition(arr, start, end)
quick_sort(arr, start, mid - 1) // 왼쪽
quick_sort(arr, mid + 1, end) // 오른쪽
quick_sort(arr, 0, len(arr) - 1)
print(arr)
📖 코드 풀이
import sys
sys.setrecursionlimit(10000)
n, k = map(int, sys.stdin.readline().split())
arr = list(map(int, sys.stdin.readline().split()))
answer = []
def partition(arr, start, end):
global k
pivot = arr[end]
i = start - 1
for j in range(start, end):
if arr[j] > pivot:
i += 1
arr[i], arr[j] = arr[j], arr[i]
k -= 1
if k == 0:
answer.append(arr[i])
answer.append(arr[j])
answer.sort()
print(answer[0], answer[1])
exit()
if i + 1 != end:
arr[i + 1], arr[end] = arr[end], arr[i + 1]
k -= 1
if k == 0:
answer.append(arr[i + 1])
answer.append(arr[end])
answer.sort()
print(answer[0], answer[1])
exit()
return i + 1
def quick_sort(arr, start, end):
if start < end:
mid = partition(arr, start, end)
quick_sort(arr, start, mid - 1)
quick_sort(arr, mid + 1, end)
quick_sort(arr, 0, len(arr) - 1)
print(-1)
sys.setrecursionlimit(10000) 설정해줘야 합니다.exit() 을 통해 프로그램을 종료해줍니다.