수 정렬하기 2
https://www.acmicpc.net/problem/2751
시간 제한메모리 제한제출정답맞힌 사람정답 비율
시간 제한 |
메모리 제한 |
제출 |
정답 |
맞힌 사람 |
정답 비율 |
2 초 |
256 MB |
247095 |
72123 |
50339 |
30.634% |
문제
N개의 수가 주어졌을 때, 이를 오름차순으로 정렬하는 프로그램을 작성하시오.
출력
첫째 줄부터 N개의 줄에 오름차순으로 정렬한 결과를 한 줄에 하나씩 출력한다.
풀이 방식
언뜻 보기에 그냥 정렬하는 문제로 보일 수 있으나 입력 조건을 잘 보면 정렬해야 하는 숫자가 한 줄 씩 받는데 최대 갯수가 1,000,000 이기 때문에 입력을 받는데 굉장히 오랜 시간이 걸리게 된다.
1번 풀이: 시간초과
N = int(input())
arr = [int(input()) for _ in range(N)]
arr.sort()
print(*arr, sep='\n')
처음에 해당 입력 조건을 그냥 생각하지 않고 풀었으나 역시 시간초과가 발생했고 이는 sys 모듈을 통해 input을 stdin.readline으로 받으면 시간을 줄일 수 있다.
2번 풀이: 성공
import sys
input = sys.stdin.readline
N = int(input())
arr = [int(input()) for _ in range(N)]
arr.sort()
print(*arr, sep='\n')
sys.stdin.readline
import sys
input = sys.stdin.readline
위와 같이 input 메소드를 오버라이딩 하면 input() 함수 사용시 sys.stdin.readline을 쓰게 된다.
특징
- 이는 기존의 input()과는 달리 문자를 화면에 출력하는 기능이 없다.
- 한 번에 읽을 수 있는 글자 수크기에 대한 매개변수를 제공한다.
- 한 번에 한 줄을 읽어들여 버퍼에 저장한다
- 하나씩 누를 때마다 데이터를 버퍼에 저장하는 input()보다 빠르며 입력 데이터 갯수가 많아질수록 그 차이는 더욱 커지게 된다.
- 이스케이프 문자(\)까지 모두 읽기 때문에 입력을 받을 경우 rstrip()을 해 주어야 마지막에 포함된 new line('\n')이 제거가 된다.
결론
input()은 문자열 변환, 줄 바꿈 제거 등 추가적인 과정이 있고, 데이터가 하나씩 버퍼에 들어가는 반면, sys.stdin.readline은 문자열 변환, 줄 바꿈 과정이 없으며 데이터 한 줄 전체가 버퍼에 들어가기 때문에 훨씬 입력 속도가 빠르다.