반복문으로 여러 줄을 입력받는 경우 input()을 사용하면 시간초과가 발생할 수 있다.
따라서 시간 초과가 나지 않기 위해서는
sys.stdin.readline()을 사용해야 한다.
📌input()이 sys.stdin.readline()보다 느린 이유
1. input()은 매개변수로 prompt message를 받는다. (따라서 입력 받기 전에 prompt message를 출력해야 한다)
2. 입력받은 값의 개행 문자를 삭제시키고 반환한다.
예시)
import sys
T = int(input())
for i in range(T):
a, b = map(int, sys.stdin.readline().split())
print(a+b)
사용 전 import sys를 잊지 말자
💖 sys.stdin.readline() 사용법
- 한 개의 정수 입력 받을 때
import sys
a = int(sys.stdin.readline())
sys.stdin.readline()은 한 줄 단위로 입력받기 때문에 개행문자 "\n"을 같이 입력받는다.
만약 "Hello World!"를 입력했다면, "Hello World!\n"이 들어오기 때문에 개행문자를 제거해야 한다.
또한 변수 타입이 문자열 형태(str)로 저장되기 때문에, 정수로 사용하기 위해서 형변환을 거쳐야 한다.
import sys
input = sys.stdin.readline
x = int(input()) #sys.stdin.readline()과 같은 역할을 함. 시간 단축 가능
맨 앞에 이렇게 정의해두면
계속 sys.stdin.readline을 부르지 않고 평소 쓰던대로 input()을 사용해도 된다.
- 2개 이상의 정수를 한 줄에 입력받을 때
import sys
N, M = map(int, sys.stdin.readline().split())
map()을 이용하여 두 개 이상의 정수를 입력받을 수 있다.
또한 split()은 문자열을 나눠주는 함수이다. 괄호 안에 특정 값을 넣어주면 그 값을 기준으로 문자열을 나누고, 아무 값도 없다면 공백(스페이스, 탭, 엔터 등)을 기준으로 나눈다.
리스트로 반환하고 싶다면 map()을 list()로 감싸줘야 한다.
list()는 자료형을 리스트형으로 변환해준다.
- 임의의 개수의 정수를 n줄 입력받아 2차원 리스트에 저장할 때
import sys
data = []
n = int(sys.stdin.readline()) #2
for i in range(n):
data.append(list(map(int, sys.stdin.readline().split()))) #3, 5
print(data) #[[3], [5]]
- 문자열 n줄을 입력받아 리스트에 저장할 때
import sys
n = int(sys.stdin.readline())
data = [sys.stdin.readline().strip() for i in range(i)]
이 때 strip()은 문자열 맨 앞과 맨 끝의 공백문자를 제거한다.
https://yeomss.tistory.com/120
'Languages > Python' 카테고리의 다른 글
[Python] leetcode | 20. Valid Parentheses 괄호 짝 맞추기 | Stack (0) | 2024.05.26 |
---|---|
[Python] 프로그래머스 | 같은 숫자는 싫어 | append (0) | 2024.05.24 |
[Python] [백준 #20291] Counter로 배열 요소 개수 세기 (0) | 2024.05.10 |
[Python] [백준 #1764] 두 개의 set(집합) 중복 요소 출력하기 (0) | 2024.05.10 |
[Python] 파이썬의 나누기(몫/나머지) // 연산자와 % 연산자 (0) | 2023.04.10 |