새소식

반응형
알고리즘(백준)/백준

[Baekjoon | 백준] 2751번. 수 정렬하기 2 (파이썬/정렬, sys.stdin.readline 사용 목적)

2023.03.11
  • -
반응형

수 정렬하기 2 

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

시간 제한메모리 제한제출정답맞힌 사람정답 비율

 

시간 제한 메모리 제한 제출 정답 맞힌 사람 정답 비율
2 초 256 MB 247095 72123 50339 30.634%

 

문제

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
 

 

알고리즘 분류

  • 정렬

 

풀이 방식

언뜻 보기에 그냥 정렬하는 문제로 보일 수 있으나 입력 조건을 잘 보면 정렬해야 하는 숫자가 한 줄 씩 받는데 최대 갯수가 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은 문자열 변환, 줄 바꿈 과정이 없으며 데이터 한 줄 전체가 버퍼에 들어가기 때문에 훨씬 입력 속도가 빠르다.

 

반응형
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.