주로 파이썬에선 알고리즘을 입력받을 때 input()
을 많이 씁니다. 하지만 input()
을 사용하면 종종 시간 초과 에러가 뜰 때가 있습니다. 이를 방지하기 위해서 사용하는 sys.stdin.input()
을 소개하고자 합니다.
sys.stdin.readline() 을 쓰는 이유
우선 왜 input()
이 sys.stdin.readline()
보다 느린지에 대해서 이야기해보겠습니다.
그 이유는 2가지가 있습니다.
1. input() 은 매개변수로 prompt message를 받는다. (따라서 입력을 받기 전에 prompt message를 출력해야 한다.)
2. 입력받은 값의 개행 문자를 삭제시키고 반환한다.
이러한 단계를 거치기 때문에 input()
은 비교적 속도가 느립니다.
➕ prompt message 란?
in_ = input("prompt message 를 입력해주세요: ")
print(in_)
참고로 prompt message는 위와 같은 것을 이릅니다.
이는 메시지를 입력받지 않을 때도 있지만 속도 지연에 여전히 작용될 수 있습니다.
sys.stdin.readline() 의 특징
✔️ 문자열로 입력을 받는다.
sys.stdin.readline()
은 문자열로 입력을 받습니다.
따라서 만약 입력받은 문자열을 정수 혹은 실수, 리스트로 사용할 때는 적절하게 함수를 사용하여 처리를 해줘야 합니다.
✔️ 개행 문자 "\n"를 같이 입력받는다.
예를 들어 만약 "Hello, World!"
라는 문자열을 입력받았다고 합시다.
그렇다면 sys.stdin.readline()
의 입력으로는 "Hello, World!/n"
가 들어오게 됩니다.
import sys
temp = sys.stdin.readline()
print(temp) # "Hello, World!\n"
즉, 개행 문자가 같이 들어오기 때문에 따로 문자열 처리를 할 필요가 있습니다.
한 줄에 하나의 값 입력받기
하나의 정수 입력받기
예시 코드
import sys
num = int(sys.stdin.readline()) # 5 입력
print(num)
출력 결과
5
- 하나의 정수 값을 입력받을 때 사용할 수 있습니다.
- 예를 들면 Test Case와 같은 값을 입력받을 때 적용 가능합니다.
- 문자열로 입력받기 때문에
int()
를 사용해서 정수로 변경해야 합니다.
개행 문자와 함께 문자/문자열 입력받기
예시 코드
import sys
s = sys.stdin.readline() # Hello, World! 입력
print(s)
출력 결과
Hello, World!
- 개행 문자와 함께 문자열을 입력받을 수 있습니다.
개행 문자 없이 문자/문자열 입력받기
예시 코드
import sys
""" 입력
Hello, World!
Hello, World!
Hello, World!
"""
s1 = sys.stdin.readline().strip()
s2 = sys.stdin.readline().strip('\n')
s3 = sys.stdin.readline().rstrip('\n')
print(s1, s2, s3)
출력 결과
Hello, World! Hello, World! Hello, World!
strip()
을 이용하여 개행 문자 없이 문자열을 입력받을 수 있습니다.strip()
은 문자열 양 옆의 \n 혹은 \t를 제거합니다.- \t 는 공백에 해당하기 때문에 인자 없이
strip()
을 쓰면 공백도 같이 제거됩니다. - 만약 확실한 게 좋다면
strip("\n")
을 쓰거나rstrip("\n")
을 쓰도록 합시다. rstrip()
은 오른쪽의 공백이나 개행 문자를 삭제합니다.strip(), rstrip()
의 매개변수로 특정 문자를 넣으면 해당 문자를 문자열에서 제거합니다.
➕ 개행 문자는 이렇게 확인 가능
예시 코드
import sys
""" 입력
Hello, World!
Hello, World!
"""
arr = []
s = sys.stdin.readline()
arr.append(s)
print(s) # 문자열 출력
print(arr) # 문자열 넣은 배열 출력
출력 결과
Hello, World!
['Hello, World!\n']
- 한 칸 뛰워진 것을 확인할 수 있습니다.
- 배열에 넣어보면 이와 같이 "\n" 도 들어 있습니다.
한 줄에 2개 이상의 값 입력받기
두 개 이상의 정수 입력받기
예시 코드
import sys
N, M = map(int, sys.stdin.readline().split()) # 5 4 입력
print(N, M)
출력 결과
5 4
map()
을 이용하여 두 개 이상의 정수를 입력받을 수 있습니다.- 리스트로 반환하고 싶다면
map()
을list()
로 감싸줘야 합니다.
➕ 만약 map() 함수가 없다면?
예시 코드
a, b = int(sys.stdin.readline().split())
print(a, b)
출력 결과
- 타입 에러가 발생합니다.
- 왜냐하면
sys.stdin.readline().split()
은 리스트로 반환이 되는데, int()
함수의 매개변수에는 리스트 타입이 아닌 문자열/객체/숫자 타입이 들어오기 때문입니다.
두 개 이상의 문자/문자열 입력받기
예시 코드
import sys
""" 입력
he l wo d
"""
strings = sys.stdin.readline().split()
print(strings)
출력 결과
['he', 'l', 'wo', 'd']
- 공백을 기준으로 문자/문자열을 입력받을 수 있습니다.
sys.stdin.readline().split()
는 리스트를 반환합니다.
여러 줄에 걸쳐서 입력받기
공백과 함께 주어지는 정수 입력받기
입력 예시
4 3
1 0 0
0 1 0
0 0 1
1 1 1
여러 줄
에 걸쳐 공백을 기준으로 떨어져 있는 정수를 입력받을 때 사용할 수 있습니다.
◾️ 2차원 배열로 입력받기 (1)
예시 코드
import sys
rows, cols = map(int, sys.stdin.readline().split())
matrix = []
for r in range(rows):
matrix.append(list(map(int, sys.stdin.readline().split())))
print(matrix)
출력 결과
[[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 1]]
◾️ 2차원 배열로 입력받기 (2) - 한 줄에
예시 코드
import sys
rows, cols = map(int, sys.stdin.readline().split())
matrix = [list(map(int, sys.stdin.readline().split())) for r in range(rows)]
print(matrix)
출력 결과
[[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 1]]
- 위와 동일하지만 한 줄에 입력받을 수 있는 코드입니다.
공백 없이 주어지는 정수 입력받기
입력 예시
4 3
100
010
001
111
- 여러 줄에 걸쳐 공백 없이 주어지는 정수를 입력받을 때 사용할 수 있습니다.
◾️ 1차원 배열로 입력받기 (1)
예시 코드
import sys
rows, cols = map(int, sys.stdin.readline().split())
matrix = [[0]] * rows # 우선적으로 초기화
for r in range(rows):
matrix[r] = sys.stdin.readline().strip()
print(matrix)
출력 결과
['100', '010', '001', '111']
◾️ 1차원 배열로 입력받기 (2) - 한 줄에
예시 코드
import sys
rows, cols = map(int, sys.stdin.readline().split())
matrix = [sys.stdin.readline().strip() for r in range(rows)]
print(matrix)
출력 결과
['100', '010', '001', '111']
- 위와 동일하지만 한 줄에 입력받을 수 있는 코드입니다.
◾️ 2차원 배열로 입력받기 (1)
예시 코드
import sys
rows, cols = map(int, sys.stdin.readline().split())
matrix = [] # 우선적으로 선언
for r in range(rows):
matrix.append(list(sys.stdin.readline().split()))
print(matrix)
출력 결과
[['100'], ['010'], ['001'], ['111']]
◾️ 2차원 배열로 입력받기 (2) - 한 줄에
예시 코드
import sys
rows, cols = map(int, sys.stdin.readline().split())
matrix = [[i for i in sys.stdin.readline().split()] for r in range(rows)]
print(matrix)
출력 결과
[['100'], ['010'], ['001'], ['111']]
- 위와 동일하지만 한 줄에 입력받을 수 있는 코드입니다.
◾️ 2차원 배열로 입력받기 (3)
예시 코드
import sys
rows, cols = map(int, sys.stdin.readline().split())
matrix = [[int(i) for i in sys.stdin.readline().strip()] for r in range(rows)]
print(matrix)
출력 결과
[[1, 0, 0], [0, 1, 0], [0, 0, 1], [1, 1, 1]]
- 하나하나 인자로 받아 이차원 배열에 저장하는 방법입니다.
문자/문자열 입력받기
입력 예시
3
Hello
I Love You
My name is World
◾️ 반복문 사용하여 입력받기
예시 코드
import sys
N = int(sys.stdin.readline())
arr = []
for i in range(N):
arr.append(sys.stdin.readline().strip())
print(arr)
출력 결과
['Hello', 'I Love You', 'My name is World']
- 개행 문자를 기준으로 주어진 문자열들을 배열에 저장하는 방법입니다.
◾️ 한 줄로 입력받기
예시 코드
import sys
N = int(sys.stdin.readline())
arr = [sys.stdin.readline().strip() for i in range(N)]
print(arr)
출력 결과
['Hello', 'I Love You', 'My name is World']
- 위와 동일하지만 한 줄에 입력받을 수 있는 코드입니다.
◾️ 반복문 사용하여 2차원으로 입력받기
예시 코드
import sys
N = int(sys.stdin.readline())
arr = []
for i in range(N):
arr.append(list(sys.stdin.readline()))
print(arr)
출력 결과
[['H', 'e', 'l', 'l', 'o', '\n'], ['I', ' ', 'L', 'o', 'v', 'e', ' ', 'Y', 'o', 'u', '\n'], ['M', 'y', ' ', 'n', 'a', 'm', 'e', ' ', 'i', 's', ' ', 'W', 'o', 'r', 'l', 'd', '\n']]
◾️ 반복문 사용하여 2차원으로 입력받기 - 한 줄에
예시 코드
import sys
N = int(sys.stdin.readline())
arr = [list(sys.stdin.readline()) for i in range(N)]
print(arr)
출력 결과
[['H', 'e', 'l', 'l', 'o', '\n'], ['I', ' ', 'L', 'o', 'v', 'e', ' ', 'Y', 'o', 'u', '\n'], ['M', 'y', ' ', 'n', 'a', 'm', 'e', ' ', 'i', 's', ' ', 'W', 'o', 'r', 'l', 'd', '\n']]
- 위와 동일하지만 한 줄에 입력받을 수 있는 코드입니다.
# 알고리즘 입력받기 # sys.stdin.readline() 입력 받기# 파이썬 입력 받기 # 파이썬 sys.stdin.readline() 입력 방법
'🧑💻 𝗣𝗿𝗼𝗴𝗿𝗮𝗺𝗺𝗶𝗻𝗴 > Python' 카테고리의 다른 글
Python 리스트 요소끼리 빼기 연산하기 (0) | 2022.06.14 |
---|---|
Python 알고리즘 테스터 코드 만들기 (0) | 2022.01.28 |
Python 기본 문법 정리 (2) | 2022.01.27 |
Python 리스트 요소 한줄에 한번에 출력하기 (3) | 2022.01.16 |
Python 딕셔너리 키/값을 기준으로 정렬하기 (0) | 2021.11.24 |