생각하는 아져씨

[Python] sys.stdin.readline 와 readline(), readlines()의 차이는? 본문

Study/Python

[Python] sys.stdin.readline 와 readline(), readlines()의 차이는?

azeomi 2022. 7. 14. 17:33

파이썬 코딩테스트를 풀다보면 input을 받아야 하는 상황이 빈번한데, 대부분 이 2가지를 많이 쓴다.

- input() : 입력의 개수가 많은 경우 동작 속도가 느려 시간 초과 발생
- 파이썬 sys 라이브러리에 정의되어 있는 함수: sys.stdin.readline()

보통 sys.stdin.readline이 속도가 빨라서 많이 쓰이는데, 문제를 풀다가 종종 헷갈려서 차이를 정리해보았다.

1. sys.stdin.readlines()

- 여러 줄을 입력으로 받는다. (종료될 때 까지)

- Ctrl+D 를 누르면 입력받기가 종료되고 다음 코드를 진행한다.

import sys
lines = sys.stdin.readlines()
print(lines)

>> 1
>> 2
>> 3
>> 4

# Press Ctrl + D
>> ['1\n', '2\n', '3\n', '4\n']

 

2. sys.stdin.readline()

- 한줄씩 입력을 받는다. (for문을 쓰면 여러 줄을 입력 받을 수 있다.)

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

>> 3
>> This
>> is
>> Python

>> ['This', 'is', 'Python']

 

3. sys.stdin.readline() 과 sys.stdin.readline 의 동작 차이

코드작성 할 때 종종 실수했던 부분이 여기이다. 괄호() 하나로 동작이 달라져서 어처구니 없는 에러를 만나게 된다. 🤯

import sys
input1 = sys.stdin.readline
input2 = sys.stdin.readline().rstrip()

print('input1: ', input1().rstrip().split(' '))
print('input2: ', input2.split(' '))

a, b = map(int, input1().rstrip().split(' '))
c, d = map(int, input2.split(' '))

print('a, b: ', a, b)
print('c, d: ', c, d)

input1은 괄호가 없이 할당, input2는 괄호가 있는 채로 할당.

이 코드를 실행해보기 전에 예상했던 시나리오는 다음과 같다.

input1 입력받고 input2 입력받고  --> 다음 map함수에서 input1 받고 input2 받기

하지만 결과는 살짝 달랐다.

>> 1 2
>> 2 3
>> input1:  ['2', '3']
>> input2:  ['1', '2']
>> 4 5
>> a, b:  4 5
>> c, d:  1 2

실제 동작 과정은

input2 입력받고 input1 받고 --> 다음 map 함수에서 input1 받고 input2는 받지 않음

약간 당황스러웠지만 너무나 당연한 결과다.

  • 괄호가 있는 채로 먼저 선언된 input2가 코드 실행 시작부터 입력을 받는다.
  • 그리고 첫번째 print문에서 input1이 괄호와 함께 호출된 순간, 두번째 입력을 받게된다. (그래서 input1 결과가 ['2', '3'])
  • 두번째 print 문에서 input2는 앞에서 입력을 이미 받았으므로 출력(input2 결과가 ['1', '2'])
  • 세번째 print 문에서 input1이 다시 호출되어서, 세번째 입력을 받게된다. (그래서 a, b 결과가 4, 5)
  • 마지막 print 문에서 input2는 앞에서 입력을 이미 받았으므로 출력(그래서 c, d 결과가 1, 2)

가장 기본적인 코드 개념인데 잠시 놓쳤다. 반성 및 기억의 의미로 정리해보았다.