[Baekjoon] Python에서 입력을 input 함수가 아닌 sys.stdin.readline 함수를 써야하는 이유 💡

정은·2023년 4월 26일

계속 BaekJoon으로 문제를 풀다보니 문제가 어렵지 않는데 내가 작성한 코드의 시간 초과가 나는 경우가 있다.

예로, 스택을 간단히 구현하면 되는 문제가 있다.

하지만 내가 작성한 코드는 시간 초과가 뜬다면..?

N = int(input()) # 주어지는 명령의 수
stack = list() # 저장 될 스택

for _ in range(N):
    commands = list(map(str, input().split()))

    if commands[0] == "push":
        stack.append(int(commands[1]))
    elif commands[0] == "pop":
        print(stack.pop() if len(stack) > 0 else -1)
    elif commands[0] == "size":
        print(len(stack))
    elif commands[0] == "empty":
        print(1 if len(stack) == 0 else 0)
    elif commands[0] == "top":
        print(stack[-1] if len(stack) > 0 else -1)

어떤 문제일까 ..?
이는 입력 방식에 초점을 둬야한다.

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

물론 간단히 한 두줄 입력받는 문제의 경우에는 input() 함수를 통해 입력받을 수 있다.
다만, 반복문으로 여러줄을 입력받아야 할 경우에는 input()으로 입력받는다면 시간 초과가 발생할 수 있다.

이에 대한 근거를 첨부하고자 백준에서는 입력 속도를 비교하는 내용을 작성해두었다.

URL : https://www.acmicpc.net/blog/view/56

우선 Python언어는 다른 언어의 비해 월등히 속도가 느리다.
다들 C,C++과 같은 언어가 컴파일러 속도가 빠른 것을 알고 있을 것이다.
이러한 특성을 가진 Python 언어에서도 입력 방식에 따라 속도가 월등히 차이나는 것을 확인할 수 있다.

위 사진을 보면,
input() 함수의 입력 속도는 평균 12.4443
sys.stdin.readline() 함수 입력 속도는 평균 4.4394초 임을 알 수 있다.
3배 정도 차이 나는 것을 확인할 수 있다.

python3 기준임⚡

그래서, 앞으로는 sys.stdin.readline()함수를 통해 입력을 받고자 한다.

📌 sys.stdin.readline() 사용방법

1. 한 개의 정수를 입력받을 때

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

❓왜 int 자료형으로 형변환을 하나요?
💡sys.stdin.readline()은 한줄을 입력받기 때문에 \n와 같은 개행문자가 같이 들어오게 되므로 제거하기 위해 형 변환을 시도한다.

2. 정해진 개수의 정수를 한줄에 입력받을 때 (2 ~3개)

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

map()함수를 추가로 사용하여 기존과 같은 방식과 동일하게 입력받는다.

📌 map()함수 사용하는 방법 보러가기

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

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

list()로 형변환하여 사용한다.

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

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

strip() 함수는 문자열 함수로 맨 앞과 맨 끝의 공백문자를 제거한다.

🖥️ sys.stdin.readline()을 사용한 백준 10828번 문제 코드

import sys

N = int(sys.stdin.readline()) # 주어지는 명령의 수
stack = list() # 저장 될 스택

for _ in range(N):
    commands = list(map(str, sys.stdin.readline().split()))

    if commands[0] == "push":
        stack.append(int(commands[1]))
    elif commands[0] == "pop":
        print(stack.pop() if len(stack) > 0 else -1)
    elif commands[0] == "size":
        print(len(stack))
    elif commands[0] == "empty":
        print(1 if len(stack) == 0 else 0)
    elif commands[0] == "top":
        print(stack[-1] if len(stack) > 0 else -1)

[References]
https://velog.io/@yeseolee/Python-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%9E%85%EB%A0%A5-%EC%A0%95%EB%A6%ACsys.stdin.readline

profile
정니의 이런거 저런거 기록 일지 😛

0개의 댓글