백준 입출력 문제를 풀면서 가장 신경써야했던 부분은 '제한시간'이였다.
문제를 제대로 풀었어도 제한시간을 초과해버리면 오답이기 때문이다.
보편적으로 입력받는 방법은 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의 오른쪽에서 제거
참고사이트
dojang.io/mod/page/view.php?id=2286
'Study > Python' 카테고리의 다른 글
[Python/파이썬] lambda와 sort 정리 (0) | 2021.03.23 |
---|---|
[Django/Python] (진행중) 점프 투 장고 2-1. 주소와 화면을 연결하는 URL과 뷰 (1) | 2021.03.22 |
[Python/파이썬] 리스트의 두 요소 위치 변경하기 (스와프,swap) (1) | 2021.02.10 |
[Python/파이썬] 리스트 요소추가 (append / insert / extend) (0) | 2021.01.27 |
[Python/Error] 파이썬 list 정렬 (sort / sorted) (0) | 2021.01.02 |