[python] 입력 받기 : input()과 sys.stdin.readline()

728x90

보통 input()으로 문자열 값을 입력받지만 반복문으로 여러 줄을 입력받아야 할 때는 시간 초과 문제가 발생할 수 있다고 한다.

따라서 이럴 경우에는 import sys로 모듈을 불러오고

sys.stdin.readline()을 사용하는 것이 좋다.

 

import sys

n = int(input('입력 : '))
sum = 0
for i in range(n):
    a = int(sys.stdin.readline())
    sum += a
print(sum)
결과 > 
입력 : 5
1
2
3
4
5

출력 >
sum = 15

input()과 마찬가지로 str형으로 받아지므로 정수로 사용할 때 형 변환에 유의해야 한다.

또한, 이것은 한 줄 단위로 입력받기 때문에 개행 문자가 포함된다.(input()은 값의 개행 문자를 삭제시켜서 리턴한다.)

따라서 리스트와 같이 여러 개의 값을 입력받아야 할 경우에는 split() 함수로 공백을 기준으로 값을 나누는 것이 좋다.

 

import sys

n = list(map(int, sys.stdin.readline().split()))
print(n)
2 3 4 5 6
출력 >
[2, 3, 4, 5, 6]

또는 .strip() 함수를 사용하여 문자열의 맨 앞, 맨 끝의 공백을 제거할 수도 있다.

.rstrip()은 오른쪽에서, .lstrip()은 왼쪽에서 공백을 제거한다.

인자값으로 공백이 아니라 특정 값을 전달하면 같은 방식으로 특정 값을 제거할 수 있다.

import sys

n = int(sys.stdin.readline())
data = [sys.stdin.readline() for x in range(n)]
data2 = [sys.stdin.readline().strip() for x in range(n)]
print(data)
print(data2)
결과 >
n >> 3 입력
data >>
1234
guitar
bass
data2 >>
5678
drum
piano

출력 > 
['1234\n', 'guitar\n', 'bass\n']
['5678', 'drum', 'piano']

 

백준 알고리즘 문제로 응용

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

 

10871번: X보다 작은 수

첫째 줄에 N과 X가 주어진다. (1 ≤ N, X ≤ 10,000) 둘째 줄에 수열 A를 이루는 정수 N개가 주어진다. 주어지는 정수는 모두 1보다 크거나 같고, 10,000보다 작거나 같은 정수이다.

www.acmicpc.net

import sys
n, x = map(int, sys.stdin.readline().split())
lst = list(map(int, sys.stdin.readline().split()))
ans = [str(i) for i in lst if i<x]
print(' '.join(ans))

 


 

input()과 sys.stdin.readline()의 차이점

그렇다면 input()과 sys.stdin.readline()의 속도 차이가 나는 원인이 무엇일까?

먼저 input()의 경우 인자로 prompt message를 받을 수 있다는 특징이 있다.

 

input()의 경우

n = int(input('값 입력 : '))

 

sys.stdin.readline()의 경우

import sys
n = int(sys.stdin.readline('값 입력'))

sys.stdin.readline() prompt message를 받아 출력을 하는 기능이 없기 때문에 상대적으로 속도가 더 빠를 것으로 보인다.

 

뿐만 아니라 input()은 사용자가 입력하는 값 하나하나마다 버퍼에 저장하는 특징이 있다. 이때 입력의 종료가 되는 기준이 개행 문자가 되므로, 개행 문자를 생략한 값을 입력 값에 저장할 수 있다.

반면에 sys.stdin.readline()는 개행 문자까지 포함한 하나의 줄을 한 번에 버퍼로 입력받는다.

 

이러한 이유로 sys.stdin.readline()는 입력이 반복될수록 input()에 비해 속도에 대한 메리트를 가지게 된다.

728x90