본문 바로가기
Algorithm/백준 알고리즘 풀이

[Baekjoon] 2750. 수 정렬하기, 2751. 수 정렬하기 2

by newnu 2021. 4. 19.
반응형

# Problem

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

입력

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

출력

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

 

# My Answer - 파이썬 기본 정렬 라이브러리로 문제 해결하기

n = int(input())
result=[]
for _ in range(n):
    result.append(int(input()))
result.sort()
for num in result:
    print(num)

 

# Solution 1 - 선택 정렬 알고리즘으로 문제 해결하기

n = int(input()) 
array = list()
for _ in range(n): 
	array.append(int(input()))
for i in range(n):
	min_index = i # 가장 작은 원소의 인덱스 
	for j in range(i + 1, n):
		if array[min_index] > array[j]: 
			min_index = j
	array[i], array[min_index] = array[min_index], array[i] # 스와프
for i in array:
    print(i)

 

# Solution 2 - 병합정렬 알고리즘 

시간복잡도 O(NlogN)

 def merge_sort(array): 
    if len(array) <= 1:
        return array
    mid = len(array) //2
    left = merge_sort(array[:mid])
    right = merge_sort(array[mid:])
    i, j, k = 0, 0, 0
    while i < len(left) and j < len(right):
        if left[i] < right[j]:
            array[k] = left[i]
            i += 1
        else:
            array[k] = right[j] 
            j += 1
        k += 1
    if i == len(left):
        while j < len(right):
            array[k] = right[j]
            j += 1
            k += 1
    elif j == len(right): 
        while i < len(left):
            array[k] = left[i]
            i += 1
            k += 1
    return array
    
n = int(input())
array = []
for _ in range(n): 
    array.append(int(input()))
array = merge_sort(array)

for data in array:
    print(data)

# 선택 정렬 알고리즘

주어진 데이터 중 최소값을 찾아 맨앞에 위치한 값과 교체

맨앞 데이터 빼고 반복

 

# 병합 정렬 알고리즘 참고

재귀 용법을 사용한 정렬 알고리즘

리스트를 반으로 잘라 나눈 후 재귀적으로 병합 정렬 

부분 리스트를 다시 하나의 정렬된 리스트로 합병

반응형