반응형

문제

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

 

문제 풀이

더보기
import sys
#계수정렬 활용
N = int(sys.stdin.readline())
arr = [0] * (10000+1) # 입력값이 10000개까지 주어지니 10000 + 1개의 리스트 선언
#각 입력값에 해당하는 인덱스의 값 증가
for _ in range(N):
    arr[int(sys.stdin.readline())] += 1
#arr에 기록된 정보 확인
for i in range(len(arr)):
    if arr[i] != 0: #0이 아닌 데이터, 즉 입력받은 데이터들을 출력
        for _ in range(arr[i]):
            print(i)

이 문제는 계수 정렬을 이용해서 푸는 문제다. sort를 이용하면 메모리 초과때문에 쓸 수가 없다.

인덱스를 계산하는 방법으로 풀어야함.

 

(1) 리스트를 [0] * (데이터의 길이 + 1)만큼 선언한다.

arr = [0] * (10000 + 1)

arr [0 ,0, 0, 0,......] 10001개의 인덱스 생성

 

(2) 입력값을 받을 때마다 그 입력값과 같은 인덱스에 +1 추가

for _ in range(n):
    arr[int(input())] += 1

1 1 1 3 2 1을 입력 받았다면 1이 4개, 2가 1개, 3이 1개 이므로

arr[0,4,1,1]이 될 것이다 

 

(3) 입력이 끝나면 0이 아닌 인덱스를 찾아 그 수만큼 인덱스를 출력해주면 된다.

for i in range(len(arr)):
    if arr[i] != 0:
        for _ in range(arr[i]):
            print(i)

 

+ Recent posts