24092번: 알고리즘 수업 - 퀵 정렬 3
2 5 1 4 3(i=0, j=1, A[1]과 A[1]이 교환됨) -> 2 5 1 4 3(i=1, j=2) -> 2 5 1 4 3(i=1, j=3, A[2]와 A[3]이 교환됨) -> 2 1 5 4 3(i=2, j=4) -> 2 1 5 4 3(i=2, j=5, A[3]과 A[5]가 교환됨) -> 2 1 3 4 5(i=0, j=1) -> 2 1 3 4 5(i=0, j=2, A[1]
www.acmicpc.net
퀵 정렬로 배열 A 오름차순 정렬 과정에서, 배열 A가 배열 B와 같은 경우가 발생하는지 확인하는 문제
-> 같아지는 경우가 발생하면 is_same 이라는 bool 변수를 True로 만들어 주었다.
주의할 점
1. 초기 상태 배열 A도 정렬 과정에서 발생 가능한 경우로 생각해야한다.
2. 이유는 모르겠지만.. sys.setrecursionlimit() 이 괄호 안에
int(1e6) 이상으로 제출하면 메모리 초과가, int(1e4) 이하로 제출하면 런타임 에러가 발생했다.
필자는 sys.setrecursionlimit(int(1e5)) & pypy3 제출으로 통과했다.
(sys.setrecursionlimit(int(1e5)) &python3으로 제출해도 통과! )
코드
import sys
sys.setrecursionlimit(int(1e5))
input = sys.stdin.readline
def quickSort(array,start,end):
global is_same
if start >= end:
return
pivot = start
left = start +1
right = end
# 초기 배열도 정렬 과정에서 발생 가능한 경우로 생각하기
if array == arrayB:
is_same = True
while left <= right:
while left <= end and array[left] <= array[pivot]:
left += 1
while right > start and array[right] >= array[pivot]:
right -= 1
if left > right:
array[right], array[pivot] = array[pivot], array[right]
else:
array[left], array[right] = array[right], array[left]
if array == arrayB:
is_same = True
quickSort(array,start,right-1)
quickSort(array,right+1,end)
n = int(input())
arrayA = list(map(int,input().split()))
arrayB = list(map(int,input().split()))
is_same = False
quickSort(arrayA,0,n-1)
if is_same:
print(1)
else:
print(0)
[알고리즘] 퀵 정렬(quick sort)
퀵 정렬 - 기준을 설정한 다음 큰 수와 작은 수를 교환한 후 리스트를 반으로 나누는 동작 - 호어 분할 방식 -> 리스트에서 첫번째 데이터를 pivot(기준)으로 정한다. -> 왼쪽에서부터 피벗보다 큰
jeongeunji1127.tistory.com
'Algorithm > Backjoon' 카테고리의 다른 글
[백준] 12015번 파이썬 - 가장 긴 증가하는 부분 수열 2 (0) | 2024.06.27 |
---|---|
[백준] 1095번 파이썬 - 마법의 구슬 (0) | 2024.05.10 |
[백준] 24090번 파이썬 - 퀵 정렬 1 (0) | 2024.04.04 |
[백준] 17406번 파이썬 - 배열 돌리기 4 (1) | 2024.04.03 |
[백준] 16927번 파이썬 - 배열 돌리기 2 (0) | 2024.04.02 |