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

이예서·2021년 1월 15일
158
post-thumbnail

이미지 출처: https://images.app.goo.gl/Fmaea14JCzUQMDVEA


💡 input()대신 sys.stdin.readline()을 사용하는 이유

한 두줄 입력받는 문제들과 다르게, 반복문으로 여러줄을 입력 받아야 할 때는 input()으로 입력 받는다면 시간초과가 발생할 수 있습니다. 대표적인 예시가 백준 BOJ 15552번 문제입니다.

BOJ 15552번

import sys

T = int(input()) #Test case
for i in range(T):
        a,b = map(int, sys.stdin.readline().split())
        print(a+b)

맨 첫줄 Test case를 입력받을 때는 input()을 사용해도 무방합니다.
그러나 반복문으로 여러줄 입력받는 상황에서는 반드시 sys.stdin.readline()을 사용해야 시간초과가 발생하지 않습니다.

💡 sys.stdin.readline() 사용법

📌한 개의 정수를 입력받을 때

import sys
a = int(sys.stdin.readline())

😨 그냥 a = sys.stdin.readline() 하면 안되나요?
👉 sys.stdin.readline()은 한줄 단위로 입력받기 때문에, 개행문자가 같이 입력 받아집니다.
만약 3을 입력했다면, 3\n 이 저장되기 때문에, 개행문자를 제거해야 합니다.
또한, 변수 타입이 문자열 형태(str)로 저장되기 때문에, 정수로 사용하기 위해서 형변환을 거쳐야 합니다.

📌정해진 개수의 정수를 한줄에 입력받을 때

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

map()은 반복 가능한 객체(리스트 등)에 대해 각각의 요소들을 지정된 함수로 처리해주는 함수입니다.
위와 같이 사용한다면 a,b,c에 대해 각각 int형으로 형변환을 할 수 있습니다.

📌 임의의 개수의 정수를 한줄에 입력받아 리스트에 저장할 때

import sys
data = list(map(int,sys.stdin.readline().split()))

split()은 문자열을 나눠주는 함수입니다.
괄호 안에 특정 값을 넣어주면 그 값을 기준으로 문자열을 나누고, 아무 값도 넣어주지 않으면 공백(스페이스, 탭, 엔터 등)을 기준으로 나눕니다.

list()는 자료형을 리스트형으로 변환해주는 함수입니다.
map()은 맵 객체를 만들기 때문에, 리스트형으로 바꿔주기 위해서 list()로 감싸주었습니다.

📌 임의의 개수의 정수를 n줄 입력받아 2차원 리스트에 저장할 때

import sys
data = []
n = int(sys.stdin.readline())
for i in range(n):
    data.append(list(map(int,sys.stdin.readline().split())))

이렇게 한다면 각 요소의 길이가 동일한 2차원 리스트도 만들 수 있고,
각각 길이가 다른 2차원 리스트도 입력 받을 수 있습니다.

📌 문자열 n줄을 입력받아 리스트에 저장할 때

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

strip()은 문자열 맨 앞과 맨 끝의 공백문자를 제거합니다.

👉 입력

3
안녕안녕
나는 지수야
헬륨가스 마셨더니 이렇게됐지

👉 출력
['안녕안녕', '나는 지수야', '헬륨가스 마셨더니 이렇게됐지']

profile
https://ohge.tistory.com/

8개의 댓글

comment-user-thumbnail
2022년 3월 25일

사랑해요

답글 달기
comment-user-thumbnail
2022년 5월 19일

사랑해요2

답글 달기
comment-user-thumbnail
2022년 7월 8일

사랑해요3

답글 달기
comment-user-thumbnail
2022년 7월 14일

사랑해요4

답글 달기
comment-user-thumbnail
2022년 9월 1일

안녕하세요. 게시글 보다가 궁금한점이 생겨서 질문드립니다.
'한 개의 정수를 입력받을 때'
a = sys.stdin.readline() 이 아닌 int(a = sys.stdin.readline())으로 입력받는 이유가 문자열로 입력받는 것이 아니라 정수로 입력받아야 하기 때문이라 이해했습니다.

그런데 여기서 int()안에 넣어주면 개행문자가 사라지는 것인지(3\n이 3만 남는 것인지) 궁금합니다.

답글 달기
comment-user-thumbnail
2022년 9월 26일

감사합니다!

답글 달기
comment-user-thumbnail
2023년 1월 20일

감사합니다!!

답글 달기
comment-user-thumbnail
2023년 3월 2일

감사합니다

답글 달기