백준 15552번 : 빠른 A+B
알고리즘 문제를 풀 때, 사용자의 입력을 받기 위해 input() 과 sys.stdin.readline() 을 사용한다.
이 때, 반복문으로 여러줄을 입력 받아야 할 때 input() 으로 입력 받으면 시간초과가 발생할 수 있다.
시간초과가 나타나는 input() 코드
num = int(input())
for i in range(num):
a, b = map(int, input().split())
print(a+b)
sys.stdin 코드
import sys
input = sys.stdin.readline()
num = int(input())
for i in range(num):
a, b = map(int, input().split())
print(a+b)
1. input() vs sys.stdin
1) input(prompt)
If the prompt argument is present, it is written to standard output without a trailing newline. The function then reads a line from input, converts it to a string (stripping a trailing newline), and returns that.
When EOF is read, EOFError is raised.
파이썬의 내장함수인 input() 은 입력으로부터 한 줄을 읽고, (개행을 지우고) 문자열로 변환 후 반환한다.
또한 EOF을 읽으면 EOF 에러를 일으킨다.
즉 input()은 여러줄을 입력 받을 때, 개행문자를 벗겨 내어 문자열로 반환로 변환 후 return을 하는 절차를 거친다.
또한 input()은 사용자가 입력할 때마다 시스템 호출이 이루어진다. 한 번의 입력마다 데이터를 처리하므로, 상대적으로 느리다.
*EOF (End Of File) : 데이터 소스로부터 더 이상 읽을 수 있는 데이터가 없음을 나타냄. 백준 문제 풀 때 최대 몇개의 입력이 들어오는지 모르는 문제에서 사용됨.
2) sys.stdin
File objects used by the interpreter for standard input, output and errors:
- stdin is used for all interactive input (including calls to input());
- stdout is used for the output of print() and expression statements and for the prompts of input();
- The interpreter’s own prompts and its error messages go to stderr.
sys.stdin.readline()은 개행 문자를 포함하여 반환한다. 하지만 input()에 비해 상대적으로 빠르고, EOF를 만나도 에러를 반환하지 않고 빈 문자열을 반환한다.
sys.stdin은 file object 이다. 파일 객체는 데이터를 메모리로 한꺼번에 읽거나 쓰는 버퍼링을 사용한다. 여러 번 입출력을 수행하는 대신 읽거나 쓸 데이터를 내부적으로 메모리 버퍼에 저장해 한 번에 데이터를 가져오고 처리하여 파일과의 상호작용 빈도를 줄여준다.
즉, sys.stdin은 여러줄을 입력 받을 때, 사용자의 입력을 받는 buffer을 만들어 읽어들어와 속도적으로 효율적이다.
2. sys.stdin.readline() 사용법
1. 문자열 입력
import sys
a = sys.stdin.readline() # 개행 문자 포함
b = sys.stdin.readline().rstrip("\n") # 개행 문자 미포함
개행 문자를 포함하기 때문에 개행 문자를 제외하고 받고 싶은 경우에는 strip( )을 통해 개행 문자를 제거
*strip()은 문자열 맨 앞과 맨 끝의 공백문자를 제거
2. N개의 문자열을 받아 리스트에 저장
import sys
n = int(sys.stdin.readline())
a = [sys.stdin.readline().strip() for i in range(n)]
3. 정수 입력
import sys
a = int(sys.stdin.readline())
sys.stdin.readline( ) 은 문자열을 반환하기 때문에 명시적으로 형변환을 해주어야 한다.
문자열을 int( )를 통해 형변환을 해주면 자동으로 개행 문자는 사라진다.
4. 여러 개의 정수 입력
import sys
a,b = map(int,sys.stdin.readline().split())