[python] input() / sys.stdin.readline() 알고 쓰시나요?

vinca·2023년 9월 22일
0
post-thumbnail

🎈Introduction

파이썬으로 백준 문제를 해결하다가 만약 많은 입출력이 필요하다면 우리는 sys.stdin.readline()을 사용한다.

이렇게 input() 대신 sys.stdin.readline() 사용하면 시간초과가 나는 문제가 갑자기 통과되는 행복한(?)현상을 발견할 수 있는데 왜 그런지 알아보자.

input()

먼저 input()은 다들 알다시피, 사용자의 입력을 문자열로 받아오는 파이썬 내장함수이다.
예제를 간단하게 보자면 다음과 같이 사용자가 입력한 내용이 출력된다.

user_input = input()
print("You entered:", user_input)  # 사용자가 입력한 내용을 출력

sys.stdin.readline()

그럼 우리가 시간초과가 날 때 사용하던 이건 뭘까?

import sys
input = sys.stdin.readline

주로 위 소스코드처럼 맨 위에 정의해두고, 우리가 일반적으로 쓰는 input()처럼 동일하게 사용할 수 있다.

user_input = input()
print("You entered:", user_input)  # 사용자가 입력한 내용을 출력

그럼 왜 sys.stdin.readline()을 사용하면 더 빠를까? 둘의 차이점을 살펴보자.

내부적으로 C 라이브러리를 사용

sys.stdin.readline()은 내부적으로 C 라이브러리를 사용하여 입력을 읽어온다.
python이 C를 기반으로 만들어지기도 했고, 인터프리터 언어인 python보다는 컴파일 언어인 C가 메모리를 접근하는데 있어 더 빠르다.

개행 문자 처리

sys.stdin.readline()은 입력 라인의 끝에 있는 개행 문자('\n')를 포함하여 읽어온다. 따라서 필요하다면 개행 문자를 직접 제거해야 하는 불편함이 있으나, 개행문자를 처리하지 않는다는 점에서 더 빠르다.
이에 반하여 input()은 개행 문자를 제거하는 과정이 포함되어있다.

Conclusion

입력이 많지 않으면 굳이 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)

profile
붉은 배 오색 딱다구리 개발자 🦃Cloud & DevOps

0개의 댓글