Algorithm/알고리즘 문제

[백준/BOJ][Python] 2751번 수 정렬하기 2

은 딩 2022. 7. 7. 20:45

https://www.acmicpc.net/problem/2751

 

2751번: 수 정렬하기 2

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

www.acmicpc.net

문제

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

입력

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

출력

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

예제 입력 1 복사

5
5
4
3
2
1

예제 출력 1 복사

1
2
3
4
5

 

아이디어

문제 자체는 쉬운데 파이썬으로 풀면서 시간초과가 났다. 반복문으로 여러 개를 입력 받을 때 input()을 쓰면 시간초과가 나올 수 있다. 이를 방지하기 위해서는 input() 대신에 import sys를 한 상태로 sys.stdin.readline()을 써주는 것이 좋다. 

시간 초과를 검색해보다가 또 알게 된 것은 문자열 n줄을 입력받아 리스트에 저장할 때이다. ( 참고로 sys.stdin.readline()은 한 줄 단위로 입력받기 때문에, 개행문자가 같이 입력받아진다. ex) 100을 입력했다면 100\n이 입력, 형변환 해주면 괜찮다. )

# 문자열 n줄을 입력받아 리스트에 저장할 때
# 원래 내 방식
n = int(input())
data = []
for _ in range(n):
	data.append(input())


# 새롭게 배운 방식
import sys
n = int(sys.stdin.readline())
data = [sys.stdin.readline().strip() for i in range(n)]

또 새로 알게 된 것은 리스트에 있는 원소만(리스트 형식 [  ] 없이)  출력하고 싶을 때이다.

import sys
n = int(sys.stdin.readline())
data = [sys.stdin.readline().strip() for i in range(n)] # 1 2 3 4 5를 입력했을 때

print(*data, sep=' ') # output : 1 2 3 4 5
print(*data, sep='') # output : 12345
print(*data, sep='\n') 
# output : 1
#         2
#         3
#         4
#         5

 

정답 코드

import sys
n = int(input())
list_a = []

for i in range(n):
    list_a.append(int(sys.stdin.readline()))

list_a.sort()
print(*list_a, sep='\n')