본문 바로가기
파이썬 관련 문법

sys.stdin.readline()으로 입력 속도 높이기: 개행문자 처리부터 주의사항까지

by arctis7p 2024. 12. 8.

코딩 테스트 문제를 풀다 보면

import sys
input = sys.stdin.readline

이런 코드를 작성해서 input을 재정의 하는 일이 종종 발생합니다.

 

왜 input을 다시 정의하는 걸까요?

사실 이런 코드는 알고리즘 문제 풀이에서 시간 초과를 피하기 위해 자주 사용됩니다.

sys.stdin.readline()이 input() 함수보다 훨씬 빠르며 대량의 데이터를 입력받을 때 특히 유용하기 때문입니다. 

 

하지만, 주의사항도 있습니다.

input() 함수를 재정의 하는 만큼 달라지는 점이 존재하는데요.

sys.stdin.readline()은 사용자가 입력한 그대로의 데이터를 읽는 반면, input() 함수는 자동으로 개행문자를 제거합니다. 

 

여기서 개행문자란 텍스트에서 줄 바꿈을 나타내는 특수문자로,

텍스트에서 한 줄의 끝을 표시하며 키보드의 enter 키를 눌렀을 때 생성되는 문자입니다.

Python에서는  \n으로 표현합니다. 즉, 텍스트 마지막에 \n이 있을 경우 줄 바꿈이 일어납니다. 

 

코드로 확인해 봅시다. 

import sys
input = sys.stdin.readline

s = input() #'hello\n' 처럼 끝에 \n이 포함됨
print(s)    #\n 개행문자 때문에 빈 줄이 같이 출력됨

이런 코드가 있을 때, 일반적인 print(“hello”)와는 달리 hello가 출력되고, \n 개행문자 때문에 빈 줄도 같이 출력될 것입니다. 

 

따라서 입력을 받을 경우

s = input().rstrip()  # 'hello'처럼 개행문자 제거

위 코드처럼 개행문자를 제거해 줘야 합니다. rstrip() 함수는 문자열 오른쪽에서 공백 문자(space), 탭 문자(\t), 개행 문자(\n), 캐리지 리턴(\r)을 모두 제거해 줍니다.

 

여기서 재미있는 점이 있는데 바로 int() 함수의 동작 방식입니다.

int() 함수는 문자열을 정수로 변환할 때 자동으로 앞뒤의 공백과 개행문자(\n)를 제거합니다. 따라서, 

s = int(input().rstrip())
s = int(input())

이 두 코드는 동일한 결과를 냅니다. 하지만 문자열을 다룰 경우 반드시 rstrip()을 사용해야 개행문자 관련 문제를 피할 수 있습니다. 

 

참고로 sys 모듈은 표준 라이브러리라서 따로 pip install 할 필요가 없습니다.