[Python] sys.stdin.readline() vs input()

2022. 3. 23. 23:38Programming/Python

 [Python] sys.stdin.readline() vs input()

파이썬으로 백준 알고리즘 문제를 풀다 보면 풀이 코드로 나오는 값은 같은데 시간 초과가 나오는 경우가 있다. 이런 경우 문제의 주제에 맞는 알고리즘을 구현을 했다면 값을 입력받는 부분을 한번 살펴보자. 

위의 사진의 경우 같은 코드로 구현이 되어있다. 실제로 문제의 코드를 살펴보자.

# input()으로 받은경우

import heapq

heap = []
n = int(input())
for _ in range(n):
    x = int(input())
    if x == 0:
        try:
            print(heapq.heappop(heap))
        except:
            print(0)
    else:
        heapq.heappush(heap, x)
# sys를 import하여 값을 받은 경우

import heapq
import sys

heap = []
n = int(input())
for _ in range(n):
    x = int(sys.stdin.readline())
    if x == 0:
        try:
            print(heapq.heappop(heap))
        except:
            print(0)
    else:
        heapq.heappush(heap, x)

실제로 보면 차이는 값을 입력받는 과정의 저 한부분이다. 그럼 input()과 sys.stdin.readline()의 차이가 무엇이길래 이러한 차이가 나오는 걸까?

 

 input()

사용자로부터 입력을 받는 함수이다. input()은 호출이 되면 cmd로부터 사용자의 입력을 받을 수 있게 해 준다. 

input()의 경우 사용자가 입력한 것을 "문자열" 타입으로 반환을 한다. 따라서 이렇게 들어온 값을 데이터 타입 변환을 통해 우리가 사용하고자 하는 데이터 타입으로 변환을 시켜 사용을 하는 것이다.  

 

  • 사용자 입력 함수
  • 문자열의 데이터 타입으로 값을 받는다.
  • enter의 입력 전까지 입력된 값을 받아온다

 

n = int(input())

 

 sys.stdin.readline()

알고리즘 상에서 반복문을 통해 여러 줄을 입력받을 때 input()을 사용하면 시간 초과를 보는 상황이 생긴다.

이러한 경우는 java에서도 존재하는데 java의 경우 Scanner 보다 Buffered를 사용하면 똑같이 시간의 차이를 줄일 수 있다.  파이썬에도 자바의 Buffered와 같이 처리 시간을 줄이는 방법이 sys 모듈의 sys.stdin.readline()이다. 

기본적으로 파이썬은 동적 변수로 이루어져있다. 동적변수로 이루어져 있어도 변수의 형태, 값을 저장하기 위해서 input() 내에서 하나씩 가공을 해야 한다. 이렇게 하나씩 가공하는 것보다 sys.stdin.readline()으로 한 번에 문자열을 입력받아 처리를 하는 게 더 빨라지는 원리이다. 

import sys

input =  sys.stdin.readline()

# 하나의 값
n = input

# 여러개의 값(숫자)
m,n = map(int, input.split())

# 임의의 개수의 정수를 리스트에 입력
num = list(map(int, input.split()))

# 정수를 입력받아 2차원 리스트에 저장
n = int(input)
num = []
for i in range(n):
	num.append(list(map(int, input.split()))

 

 

마무리

  알고리즘 문제를 풀면서 input()의 경우 낮은 레벨에서의 문제에서는 시간 초과와 같은 상황은 나타나지 않는다. 난이도가 올라가는 그래프 탐색 등의 문제가 등장하면 값을 여러 번 입력받고 문제의 회전 수도 많아지게 된다. 이러한 상황에 만약 본인의 코드가 문제가 요구하는 알고리즘에 맞는다면 입력값을 받는 부분을 한번 변경해보자. 

  

'Programming > Python' 카테고리의 다른 글

[Python] n진법 변환  (0) 2022.11.24
[Python] sort & sorted  (0) 2022.11.16
[Python] 문자열 인덱싱 / 슬라이싱  (0) 2022.11.15
[Python] 파이썬 with이란?  (0) 2022.09.12
[Python] 알고리즘 - 파이썬  (0) 2022.07.02