Python/백준

[Python 문법] 파이썬 입력 받기 (sys.stdin.readline)

qqprty 2025. 1. 26. 10:17

백준 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())