파이썬으로 백준 문제를 해결하다가 만약 많은 입출력이 필요하다면 우리는 sys.stdin.readline()을 사용한다.
이렇게 input() 대신 sys.stdin.readline() 사용하면 시간초과가 나는 문제가 갑자기 통과되는 행복한(?)현상을 발견할 수 있는데 왜 그런지 알아보자.
먼저 input()
은 다들 알다시피, 사용자의 입력을 문자열로 받아오는 파이썬 내장함수이다.
예제를 간단하게 보자면 다음과 같이 사용자가 입력한 내용이 출력된다.
user_input = input()
print("You entered:", user_input) # 사용자가 입력한 내용을 출력
그럼 우리가 시간초과가 날 때 사용하던 이건 뭘까?
import sys
input = sys.stdin.readline
주로 위 소스코드처럼 맨 위에 정의해두고, 우리가 일반적으로 쓰는 input()
처럼 동일하게 사용할 수 있다.
user_input = input()
print("You entered:", user_input) # 사용자가 입력한 내용을 출력
그럼 왜 sys.stdin.readline()을 사용하면 더 빠를까? 둘의 차이점을 살펴보자.
sys.stdin.readline()
은 내부적으로 C 라이브러리를 사용하여 입력을 읽어온다.
python이 C를 기반으로 만들어지기도 했고, 인터프리터 언어인 python보다는 컴파일 언어인 C가 메모리를 접근하는데 있어 더 빠르다.
sys.stdin.readline()
은 입력 라인의 끝에 있는 개행 문자('\n')를 포함하여 읽어온다. 따라서 필요하다면 개행 문자를 직접 제거해야 하는 불편함이 있으나, 개행문자를 처리하지 않는다는 점에서 더 빠르다.
이에 반하여 input()
은 개행 문자를 제거하는 과정이 포함되어있다.
입력이 많지 않으면 굳이 sys.stdin.readline()
를 사용하지 않는 것이 좋으나,
만약 사용한다면 rstrip()
을 통해서 str 문자열의 공백(\n)을 제거하는 과정을 해줘야만 문제가 해결되는 상황이나올 수 있다.
쓰는 경우와 안 쓰는 경우의 속도차이가 엄청나긴하다. 이 1764 문제의 경우 sys.stdin.readline()
를 사용하다 rstrip()
을 해주지 않는 경우 출력형식의 오류가 발생하였다.
import sys
input = sys.stdin.readline
a_set = set()
ans_list = []
a ,b = map(int, input().split())
for _ in range(a):
a_set.add(input().rstrip())
for _ in range(b):
name = input().rstrip()
if name in a_set:
ans_list.append(name)
ans_list.sort()
print(len(ans_list))
for n in ans_list:
print(n)