[Python] 사용자 입출력

이정훈·2022년 5월 7일

Python

목록 보기
3/4
post-thumbnail

input 함수

파이썬에서 사용자로 부터 입력을 받는 방법 중 하나로 input이라는 내장 함수를 이용 할 수 있다.
그 형태는 다음과 같다.

>>> a = input()
10
>>> a
10

위와 같이 사용자로 부터 정수 10을 받아 변수 a에 대입하고 a를 호출하여 a에 저장된 값을 불러 올 수 있다.

하지만 input 함수는 위와 같이 한, 두 개의 값을 입력 받는데에는 큰 문제가 없지만 반복문을 이용하여 여러개의 값을 input 함수로 입력 받는 경우 시간 초과의 경우가 발생 할 수 있다.

왜 시간 초과가 발생 하는가?

input 함수의 사용으로 인한 시간 초과의 이유는 input 함수가 느리다는 점인데 input 함수가 느린 이유를 알아 보자

  • 프롬프트 메세지
    input 함수의 특징 중 하나로 프롬프트 메세지을 입력하여 문구나 질문을 나오게 할 수 있다는 것이다. 하지만 input 함수는 입력 값을 받기 전 이 프롬프트 메시지를 출력해야 하므로 이러한 처리 과정에서 속도에 차이가 발생한다.

  • 개행 문자(\n)
    기본적으로 input 함수는 입력 값을 문자열로 저장하고 개행 문자(\n)을 삭제하여 변수에 저장하게 된다. 개행 문자를 삭제는 과정에서 다시 속도에 차이가 발생한다.

sys.stdin.readline()

이러한 시간 초과 문제를 해결할 방법으로 sys 라이브러리에 있는 sys.stdin.readline()를 사용한다.
sys.stdin.readline()은 프롬프트 메세지를 지원하지 않으며, 개행 문자(\n)를 포함하여 변수에 값을 저장한다.

다음은 sys.stdin.readline()을 사용하여 값을 입력받는 코드이다.

import sys

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

sys 모듈을 불러오기 위해 import sys를 입력해준다.
input과 마찬가지로 입력값을 문자열로 취급하기 때문에 int형을 원하면 int형으로 변환해준다.
split() 함수는 입력받은 문자열을 공백기준으로 나누어준다.

다음은 sys.stdin.readline()을 사용하여 여러개의 값을 입력 받는 코드이다.

import sys

A, B, C = map(int, sys.stdin.readline().split())

map은 반복가능한 자료형의 요소를 함수가 수행한 결과로 묶어서 돌려준다. 따라서 split()으로 입력 받는 값을 공백 기준으로 나누어 리스트로 반환하고 이 리스트의 요소는 int 함수을 거친 결과 값을 변수에 돌려준다.

sys.stdin.readline()과 sys.stdin의 차이

import sys

num = []
for i in sys.stdin.readline():
	num.append(i)

print(num)
출력
1 2 3 4 5
['1', ' ', '2', ' ', '3', ' ', '4', ' ', '5', '\n']

sys.sdtin.readline()은 입력값을 받아 띄어쓰기와 개행문자를 포함하여 결과값을 출력한다. 만약 띄어쓰기와 개행문자를 제거하고 싶으면 split() 함수를 사용하여 제거한다.

import sys

for i in sys.stdin:
	print(i)
1 1
1 1
2 2
2 2

sys.stdin도 sys.stdin.readline()과 마찬가지로 개행문자를 포함하여 입력값을 전달 받지만 차이점은 여러줄의 입력값을 받을 수 있다는 것이다. sys.stdin은 직접 함수를 종료하기 전까지 종료되지 않기 때문에 ^Z을 입력하여 함수를 직접 종료한다.

sys.stdin.readline()으로 여러개의 값을 입력 받기 위해서는 반복문을 활용하면 구현이 가능하다.

import sys

N = int(input())
a = [sys.stdin.readline() for _ in range(N)]
출력
3
1 2 3
4 5 6
7 8 9
['1 2 3\n', '4 5 6\n', '7 8 9\n']
profile
새롭게 알게된 것을 기록하는 공간

0개의 댓글