본문 바로가기
CS 공부/알고리즘

Sort - 백준 2751: 수 정렬하기 2

by 꼬질꼬질두부 2022. 11. 17.

수 정렬하기 2 - 시간복잡도 O(nlogn)

문제

N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 절댓값이 1,000,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.

출력

첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.

예제 입력 1 복사

5
5
4
3
2
1

예제 출력 1 복사

1
2
3
4
5

 



mergeSort 이용

#mergeSort
#PYPY3로 제출

def mergeSort(arr):
    #1과정
    if len(arr) > 1:
        mid = len(arr) // 2
        left = arr[:mid]
        right = arr[mid:] # left right로 나누기

        mergeSort(left)
        mergeSort(right) #결국 left right에 하나의 원소 씩만 남을 때까지 mergeSort

        i, j, k = 0, 0, 0

        #2과정
        while i < len(left) and j < len(right): # left와 right의 길이가 0보다 큰 동안
            # left[i]와 right[i] 중에 더 작은 수를 arr[k](arr의 맨 앞부터) 저장
            if left[i] < right[j]:
                arr[k] = left[i]
                i += 1
            else:
                arr[k] = right[j]
                j += 1
            k += 1

        #3과정
        while i < len(left):
            arr[k] = left[i]
            i += 1
            k += 1
            
        while j < len(right):
            arr[k] = right[j]
            j += 1
            k += 1

    return arr

N = int(input())
nums = []
for _ in range(N):
    nums.append(int(input()))

mergeSort(nums)

for i in nums:
    print(i)

 

left = [ 15 20 ]

right = [ 5 26 ]

일 때

#2과정과 #3과정의 진행 방식

댓글