Python sys.stdin.readline() 사용 / 알고리즘 입력 받기
🧑‍💻 𝗣𝗿𝗼𝗴𝗿𝗮𝗺𝗺𝗶𝗻𝗴/Python

Python sys.stdin.readline() 사용 / 알고리즘 입력 받기

주로 파이썬에선 알고리즘을 입력받을 때 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() 입력 방법


 

728x90