Study/Python

[Python/파이썬] 파이썬 입력받는 방법 with input()과 sys.stdin.readline()

growingtree 2021. 3. 9. 10:56

백준 입출력 문제를 풀면서 가장 신경써야했던 부분은 '제한시간'이였다.

문제를 제대로 풀었어도 제한시간을 초과해버리면 오답이기 때문이다. 

 

보편적으로 입력받는 방법은 input함수를 쓰는 방법이다.

나도 input()으로 입력을 받아 문제를 풀었는데 input은 시간이 오래걸려서 시간초과되기 십상이다.

(특히 반복문을 써서 여러 줄을 입력받는 경우)

 

input보다 속도가 더 빠른 방법은 없을까?

 

 

파이썬의 표준 라이브러리인 sys의 sys.stdin.readline()을 사용하면 더 빠르게 처리할 수 있다!!

(sys란? sys 모듈은 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈이다.)

 

 

같은 문제라도 5달 전에 푼 문제는 

count = int(input())
num = input()
sum =0

for i in num:
    i = int(i)
    sum += i 
print(sum)

이렇게 input함수를 사용해 문제를 풀었고 시간은 78ms 메모리는 29380KB를 사용했다.

 

하지만, 13분 전에 푼 문제는

import sys

len_number = int(sys.stdin.readline())
number = sys.stdin.readline()
sum = 0

for x in range(len_number):
    sum += int(number[x])

print(sum)

sys.stdin.readline()을 사용했다.

시간은 68ms 메모리는 28776KB를 사용했다.

 

그냥 봐도 input()보다 sys.stdin.readline()이 좀 더 빠르고 메모리도 적게 소모한다는 것을 알 수 있다.

 

 

그렇다면, sys.stdin.readline()은 어떻게 사용하는 것일까?

 

 

1. 문자열을  받을 때

import sys

sentence = sys.stdin.readline()

sys.stdin.readline()은 return값이 문자열이므로 그냥 문장을 하나 받을 때 사용가능하다.

sys.stdin.readline()을 출력하면 문자열에 개행문자(\n)가 기본으로 추가됨도 확인 가능하다.

 

 

2. 한 개의 정수를 입력받을 때

import sys

number = int(sys.stdin.readline())

그냥 sys.stdin.readline()의 return 값은 문자열(string)이기 때문에 정수로 입력받으려면 형변환을 해줘야한다.

sys.stdin.readline()으로 받은 문자열은 개행문자(\n)을 포함한다. 

문자열을 int()로 형변환을 해주면 개행문자는 사라지고 정수형태만 남는다.

 

 

3. 여러 개의 정수를 입력받을 때

import sys

a,b = map(int,sys.stdin.readline().split())

#input을 썼을 때
#a,b = map(int,input().split())

#map 함수를 안쓰고도 이렇게도 가능하다.
#a,b = input().split()
#a = int(a)
#b = int(b)

여러개의 정수를 입력받으려면 map 함수를 사용하면 된다.

map함수는 요소를 지정된 함수로 처리해주는 함수다. 위 코드에서 요소 sys.stdin.readline() 를 정수로 처리해주기 위해 int 함수를 앞에 적었다. 

 

여러개의 정수를 입력받는 방법은 이뿐만 아니라 input()과 split()을 이용해 사용할 수 있다.

하지만 여러개의 정수를 입력할 때도 sys.stdin.readline() 가 input()보다 빠르다.

 

 

4. 문자열 N줄을 입력받아 리스트에 저장할 때 

import sys
n = int(sys.stdin.readline())
data = [sys.stdin.readline().strip() for i in range(n)]

문자열을 N개 라고 지정되어있는 경우 for문을 사용해 문자열 N개를 리스트에 저장할 수 있다.

여기서 strip()은 문자열 앞과 끝의 공백문자를 제거해주는 함수다.

 

*참고*

lstrip() : 인자로 받은 문자를 String의 왼쪽에서 제거

rstrip() : 인자로 받은 문자를 String의 오른쪽에서 제거

 

 

 

 

 


참고사이트

 

wikidocs.net/33

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

velog.io/@yeseolee/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%A0%95%EB%A6%ACsys.stdin.readline

 

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

파이썬으로 코딩 테스트를 준비한다면, 반드시 알아야 할 입력방식인 sys.stdin.readline()에 대한 정리 입니다.

velog.io

dojang.io/mod/page/view.php?id=2286

 

파이썬 코딩 도장: 22.6 리스트에 map 사용하기

이번에는 리스트에 map을 사용해보겠습니다. map은 리스트의 요소를 지정된 함수로 처리해주는 함수입니다(map은 원본 리스트를 변경하지 않고 새 리스트를 생성합니다). list(map(함수, 리스트)) tupl

dojang.io

 

반응형