입력을 받는 방법
알고리즘 문제를 풀다 보면 문제에서 주어진 입력을 받아 처리해야 하는 경우가 많다. Python의 경우 입력을 받을 수 있는 방법이 대표적으로 2가지가 있는데 input()
과 sys.stdin.readline()
이 그것이다. 보통 처음에 Python을 배울 때는 아마 대부분 input()
을 사용했을 것이다. 나도 이 글을 쓰기 전 까지는 그랬다. 그런데, input()
을 통해 입력받는 것이 속도가 느리다는 사실을 알게 되었고 알고리즘 문제를 풀 때 어떤 문제에서는 시간초과 이슈를 발생시키기도 한다는 사실을 알았다. 따라서, 이글에서는 input()
대신에 사용할 수 있는 sys.stdin.readline()
에 대해서 알아보고 둘 사이에 어떤 차이점이 있는지, 언제 어떤걸 쓰면 좋을지를 정리해보자.
input()
공식 문서에 따르면 input()
은 (직역주의😅)
- prompt 인자가 있으면, 개행없이 표준 출력으로 기록된다.
input()
으로 부터 받은 입력의 개행문자를 벗겨서(stripping) 문자열로 변환한 값을 리턴한다.- EOF(End of file)이 읽혀지면, EOFError를 발생시킨다.
즉, input()
에 입력을 할 때 입력값을 넣고 엔터를 치면 그 때 발생한 개행문자(\n
)를 없애고 문자열로 만들어서 리턴한다. 또한, 더 이상 받을 입력이 없으면 EOFError를 출력한다.
EOF(End of file)이란?
파일의 끝을 의미하며 데이터 소스로부터 더 이상 읽을 수 있는 데이터가 없음을 나타낸다. C언어에서는 EOF는 -1이라는 상수값을 가지고 있다.
sys.stdin.readline()
일단, sys
모듈은 Python 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈이다. stdin
은 sys
모듈안에 있는 파일 객체이고 공식문서에 따르면,
File objects used by the interpreter for standard input
stdin
은 파이썬 인터프리터가 표준 입력에 사용하는 파일 객체readline()
은 파일 객체의 메소드 중 하나로read()
,readlines()
와 같이 파일 객체를 읽을 때 사용한다.
즉, sys.stdin.readline()
은 sys
라는 모듈의 파일 객체 stdin
의 메소드 중 readline()
을 사용한다는 의미이다. readline()
은 입력을 읽을 때 한 번에 한 줄씩 읽는데, 이 말은 여러 줄의 입력이 있을 때 한 줄을 읽고 나면 그 다음 줄을 가리킨다는 뜻이다.
차이점
input()
과 sys.stdin.readline()
은 정확하게는 하는 일이 다르다. python2 에서 보다는 덜 해졌지만 여전히 차이점이 존재한다. 무엇보다 input()
은 파이썬의 내장함수이고, sys.stdin
은 File objects 로 분류된다. (파일 객체라는게 정확히 어떤 의미인지는 모르겠다;;🤯)
input()
은prompt
인자가 있는데 이로 인해 오버헤드가 발생할 수 있다.(인자값을 주지 않는 경우라도)input()
은 공백을 제거하고 결과를 리턴, 반면에sys.stdin.readline()
은 공백, 개행문자등을 함께 리턴하므로 제거하기 위해서는strip()
을 써야함.sys.stdin.readline().strip()
이렇게input()
은 더이상 읽을게 없으면 EOF에러를 발생시키지만,sys.stdin.readline()
은 읽을게 없을때는 빈 문자열을 리턴한다. 입력초과 발생 우려가 있다.
콘솔에서 Ctrl + D 입력하면 EOF를 발생시킬 수 있다. 각각 결과가 다르게 나오는 것을 볼 수 있다.
# input() 일때, EOF발생시키면 EOFError발생
>> s = input("-->")
>> print(s)
Traceback (most recent call last):
File "main.py", line 3, in <module>
s = input("-->")
EOFError
# sys.stdin.readline() 일때, 빈 문자열 리턴(에러발생 X)
>> s = sys.stdin.readline()
>> print(s)
>>
개행문자 리턴
>> s = input()
>> print(list(s))
hello
['h','e','l','l','o']
import sys
>> s = sys.stdin.readline()
>> print(list(s))
hello
['h','e','l','l','o','\n']
# strip()
>> s = sys.stdin.readline().strip()
>> print(list(s))
hello
['h','e','l','l','o']
참고자료
'TIL' 카테고리의 다른 글
[TIL] #7. Semantic Web, Semantic Tag (0) | 2021.03.16 |
---|---|
[TIL] #6. HTTP (0) | 2021.03.14 |
[TIL] #4. sorted()와 sort() (0) | 2021.02.28 |
[TIL] #3. List Comprehension (0) | 2021.02.25 |
[TIL] #2. 자기소개 페이지 만들기 (0) | 2021.02.21 |