Post

15. Python(수 정렬하기(심화))

15. Python(수 정렬하기(심화))

[toc]

수 정렬하기(심화)

문제

  1. https://www.acmicpc.net/problem/10989

제출(오답)

코드1 - 메모리 초과

1
2
3
4
5
6
7
8
9
10
11
12
import sys
import heapq

n = int(sys.stdin.readline().strip())
min_heap = []

for _ in range(n):
    n_lst = int(sys.stdin.readline().strip())
    heapq.heappush(min_heap, n_lst)

while min_heap:
    print(heapq.heappop(min_heap))
1
2
3
4
5
6
7
8
9
10
11
12
# 입력
10
5
2
3
1
4
2
3
5
1
7
1
2
3
4
5
6
7
8
9
10
11
# 출력
1
1
2
2
3
3
4
5
5
7

오답 풀이

1. 틀린 이유

  • 한 가지 조건을 보지 못하고 코드를 작성함

“첫째 줄에 수의 개수 N(1 ≤ N ≤ 10,000,000)이 주어진다. “

  • 그리고 메모리 제한도 8 MB로 N개의 최대값인 10,000,000개를 모두 저장해선 안 됨
    • 그말은 즉, sort와 sorted를 사용할 수 없다는 뜻

2. 다른 방법 생각

1) 리스트 사용
1
2
3
4
import sys

n = int(sys.stdin.readline())
n_lst = [0] * 10001
  • 우선 최대 10,000개의 수가 들어갈 수 있다는 조건을 보고 리스트 크기를 10,001로 설정
1
2
for _ in range(n):
    n_lst[int(sys.stdin.readline())] += 1
  • 이후 n개의 숫자를 입력받는데, 받으면서 n_lst에 입력한 인덱스에 1씩 더함
    • 중복되는 숫자도 포함시키기 위함
2) 출력
1
2
3
4
for i in range(10001):
    if n_lst[i] != 0:
        for j in range(n_lst[i]): ## 중복된 수 누락 방지
            print(i)
  • for i in range(10001):는 1부터 10,000까지 각 숫자를 순서대로 확인함
  • 만약 n_lst[i]가 0이 아니라면, i가 n_lst[i]번 등장했다는 의미이므로 for j in range(n_lst[i])를 통해 i를 n_lst[i]번 반복 출력함
  • 이렇게 하면 각 숫자가 등장한 횟수만큼 출력되어 중복된 숫자도 누락 없이 출력됨

제출(정답)

코드2

1
2
3
4
5
6
7
8
9
10
11
12
import sys

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

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

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