본문 바로가기
Python

[백준] 10989번 : 수 정렬하기 3

by Leunco 2022. 1. 1.
유형 : 정렬

[예제]

10
5
2
3
1
4
2
3
5
1
7

[출력]

1
1
2
2
3
3
4
5
5
7

1. 내 풀이(틀림)

더보기
N = int(input())

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

num_list = sorted(num_list)

for i in range(N):
    print(num_list[i])

▷ 메모리 초과로 실패

▷ 기본 정렬 라이브러리로는 안 되는 듯 하다.

▷ 반복문 안에 append를 썼기 때문에 메모리 재할당이 일어나 속도 저하와 비효율적인 메모리 사용이 발생한다. (출처)

FAQ : https://www.acmicpc.net/board/view/26132

모든 입력을 배열에 저장하면 당연히 메모리 초과입니다. 문제의 메모리 제한은 겨우 8MB입니다. 아무리 작은 자료형으로 저장한다고 해도 short형 (2바이트) 천만 개면 약 20MB로 역시 메모리 초과입니다. 입력을 전부 저장하지 않고 푸는 방법을 생각해 보세요. 힌트는 입력되는 정수의 범위에 있습니다.

 

2. 다른 풀이

출처 : 패스트캠퍼스 - 알고리즘 / 기술면접 완전 정복 올인원 패키지 Online

** 핵심 아이디어
1. 데이터 개수가 최대 10,000,000개
2. 시간 복잡도가 O(N)인 정렬 알고리즘을 이용
3. 수의 범위가 1 ~ 10,000이므로 계수 정렬 이용

 

* 계수 정렬(Counting Sort) 알고리즘

- 배열의 인덱스를 특정한 데이터의 값으로 여기는 정렬 방법
- 배열의 크기는 데이터의 범위를 포함할 수 있도록 설정

- 데이터가 등장한 횟수를 셈

- 유의사항 : 데이터의 개수가 많을 때 파이썬에서는 sys.stdin.readline()를 사용해야 함

ex. [3,3,7]

- 3이 2번 등장 : 3의 인덱스는 2

- 7이 1번 등장 : 7의 인덱스는 1
→ 앞에서부터 진행해서 수 하나씩 등장할 때마다 인덱스를 하나씩 증가

 

import sys

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

for i in range(n):
    data = int(sys.stdin.readline())
    array[data] += 1

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


문제 출처 : https://www.acmicpc.net/problem/10989

 

10989번: 수 정렬하기 3

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

www.acmicpc.net

 

반응형

'Python' 카테고리의 다른 글

[백준] 1074번 : Z ☆  (0) 2022.01.01
[백준] 2747번 : 피보나치 수  (0) 2022.01.01
[백준] 11650번 : 좌표 정렬하기  (0) 2021.12.31
[백준] 10814번 : 나이순 정렬  (0) 2021.12.31
[백준] 1427번 : 소트인사이드  (0) 2021.12.27

댓글