본문 바로가기
Algorithm/Backjoon

[백준] 24092번 파이썬 - 퀵 정렬 3

by chobbo 2024. 4. 4.

 

 

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