문제

N개의 수로 이루어진 수열 A[1], A[2], …, A[N]이 있다. 
이 수열에 대해서 버블 소트를 수행할 때, Swap이 총 몇 번 발생하는지 알아내는 프로그램을 작성하시오.

버블 소트는 서로 인접해 있는 두 수를 바꿔가며 정렬하는 방법이다. 
예를 들어 수열이 3 2 1 이었다고 하자. 
이 경우에는 인접해 있는 3, 2가 바뀌어야 하므로 2 3 1 이 된다. 
다음으로는 3, 1이 바뀌어야 하므로 2 1 3 이 된다. 
다음에는 2, 1이 바뀌어야 하므로 1 2 3 이 된다. 
그러면 더 이상 바꿔야 할 경우가 없으므로 정렬이 완료된다.

 

입력

첫째 줄에 N(1 ≤ N ≤ 500,000)이 주어진다. 
다음 줄에는 N개의 정수로 A[1], A[2], …, A[N]이 주어진다. 
각각의 A[i]는 0 ≤ |A[i]| ≤ 1,000,000,000의 범위에 들어있다.

 

출력

첫째 줄에 Swap 횟수를 출력한다

 

정답

import sys
input = sys.stdin.readline

n = int(input())
A = list(map(int, input().split()))
B = 0
def merge_sort(start, end):
    global B, A
    if start < end:
        mid = (start + end) // 2
        merge_sort(start, mid)
        merge_sort(mid + 1, end)
        temp = []
        x, y = start, mid + 1
        while x <= mid and y <= end:
            if A[x] <= A[y]:
                temp.append(A[x])
                x += 1
            else:
                temp.append(A[y])
                y += 1
                B += (mid - x) + 1
        if x <= mid:
            temp = temp + A[x:mid + 1]
        if y <= end:
            temp = temp + A[y:end + 1]
        for i in range(len(temp)):
            A[start+i] = temp[i]
        
    

merge_sort(0, n-1)
print(B)

'Coding_Test > Python Code Review' 카테고리의 다른 글

[백준-10989] 수 정렬하기3  (0) 2023.11.02
[백준-2751] 수 정렬하기2  (0) 2023.11.02
[백준-11004] K번째 수  (0) 2023.11.02
[백준-11399] ATM  (1) 2023.11.01
[백준-1427] 소트인사이드  (0) 2023.11.01