보통 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
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()에 비해 속도에 대한 메리트를 가지게 된다.
'파이썬' 카테고리의 다른 글
[파이썬] 이진 탐색 라이브러리 bisect (0) | 2022.02.24 |
---|---|
[파이썬] 딕셔너리(Dictionary) 자료형 정리 (0) | 2022.02.23 |
[python] 정렬 함수 sort(), sorted() (0) | 2022.01.28 |