백준 10989번 : 수 정렬하기3

2023. 10. 13. 11:44[알고리즘]/문제 풀이

문제

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

입력

첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. 둘째 줄부터 N개의 줄에는 수가 주어진다. 이 수는 10,000보다 작거나 같은 자연수이다.

출력

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

예제 입력 1 복사

10
5
2
3
1
4
2
3
5
1
7

예제 출력 1 복사

1
1
2
2
3
3
4
5
5
7

 

 

🍃 풀이

1) 틀린 답 (메모리 초과)

N = int(input())
num_list = []

for _ in range(N):
    num = int(input())
    num_list.append(num)

sorted_list = sorted(num_list)

for num in sorted_list:
    print(num)

- sort, sorted() 사용 했었음.

- 입력값이 극한으로 많이 주어질 때에는 메모리를 효율적으로 관리해야함.

 

 

2) 틀린 답 퀵정렬 사용(메모리 초과)

N = int(input())

num_list = []

for _ in range(N):
    num = int(input())
    num_list.append(num)

def quick_sort(array):
    if len(array) <= 1:
        return array
    
    pivot = array[0]
    tail = array[1:]
    
    left_side = [x for x in tail if x <= pivot]
    right_side = [x for x in tail if x > pivot]

    return quick_sort(left_side) + [pivot] + quick_sort(right_side)


for num in quick_sort(num_list):
    print(num)

- 퀵 정렬은 매우 큰 입력값을 처리할 땐 메모리 초과가 발생할 수 있다.

 

 

🍃 정답

import sys

n = int(sys.stdin.readline())
num_list = [0] * 10001

for _ in range(n):
    num_list[int(sys.stdin.readline())] += 1

for i in range(10001):
    if num_list[i] != 0:
        for j in range(num_list[i]):
            print(i)

계수정렬(counting sort)

- 특정한 조건이 부합할 때, 배열 원소 간 비교하지 않고 정렬하는 알고리즘이다.

- 특정한 조건이란, 원소들이 정수이며 0~K(K=정수)의 범위 안에 포함될 때를 가정한다.

- O(N+K)의 시간, 공간 복잡도를 가진다.

- 만약 최댓값 k가 n보다 작은 수이면 O(n)이 되지만, k가 n보다 매우 큰 수이면 O(무한)이 될 수도 있다.

 

제약조건

- 데이터는 양수여야한다.

- 값의 범위가 너무 크지 않아야 한다.(메모리 사이즈를 넘어서는 안된다.)

 

장점

알고리즘에서 데이터 간 비교를 수행하지 않기 때문에 O(N)의 시간 복잡도의 성능을 보여준다.

  • 이는, 기존에 우수한 정렬 알고리즘으로 평가받는 퀵 정렬, 병합 정렬 O(NlogN) 보다 더 빠르다.

데이터가 정수 표현이 가능하고, 데이터 간 차이가 크지 않을 때 유리하다.

 

단점

많은 메모리 공간을 필요로 한다.(K 크기의 배열을 만들어야 한다.)

  • ex) 데이터가 5개 존재하는데 각각 0, 3, 2, 1, 1000000 이라면? 단 아닐때는 유리하다.

 

 

반응형

'[알고리즘] > 문제 풀이' 카테고리의 다른 글

백준 27323번 : 직사각형  (1) 2023.10.13
백준 1085번 : 직사각형에서 탈출  (0) 2023.10.13
백준 2164번 : 카드2  (0) 2023.10.12
백준 9012번 : 괄호  (0) 2023.10.12
백준 10773번 : 제로  (0) 2023.10.12