
계속 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() 함수를 통해 입력받을 수 있다.
다만, 반복문으로 여러줄을 입력받아야 할 경우에는 input()으로 입력받는다면 시간 초과가 발생할 수 있다.
이에 대한 근거를 첨부하고자 백준에서는 입력 속도를 비교하는 내용을 작성해두었다.

우선 Python언어는 다른 언어의 비해 월등히 속도가 느리다.
다들 C,C++과 같은 언어가 컴파일러 속도가 빠른 것을 알고 있을 것이다.
이러한 특성을 가진 Python 언어에서도 입력 방식에 따라 속도가 월등히 차이나는 것을 확인할 수 있다.
위 사진을 보면,
input() 함수의 입력 속도는 평균 12.4443초
sys.stdin.readline() 함수 입력 속도는 평균 4.4394초 임을 알 수 있다.
3배 정도 차이 나는 것을 확인할 수 있다.
python3 기준임⚡
그래서, 앞으로는 sys.stdin.readline()함수를 통해 입력을 받고자 한다.
import sys
a = int(sys.stdin.readline())
❓왜 int 자료형으로 형변환을 하나요?
💡sys.stdin.readline()은 한줄을 입력받기 때문에 \n와 같은 개행문자가 같이 들어오게 되므로 제거하기 위해 형 변환을 시도한다.
import sys
a,b,c = map(int,sys.stdin.readline().split())
map()함수를 추가로 사용하여 기존과 같은 방식과 동일하게 입력받는다.
import sys
data = list(map(int,sys.stdin.readline().split()))
list()로 형변환하여 사용한다.
import sys
n = int(sys.stdin.readline())
data = [sys.stdin.readline().strip() for i in range(n)]
strip() 함수는 문자열 함수로 맨 앞과 맨 끝의 공백문자를 제거한다.
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