백준, 프로그래머스 , codeforce, leetcode같은 online judge에서 문제를 풀다가 입출력부분에서 시간초과가 나는 경우가 꽤 흔합니다. 심지어 입출력을 빠르게 수행하도록 하는 코드부분만 바꿨을때 맞는 경우도 존재합니다.
이를 해결할 방법과 이유를 설명드리겠습니다.
해당 링크에 대한 코드로 설명하겠습니다.
먼저 input()함수를 이용해 입력을 받을 때 매우 느려 10만개 이상 입력을 받았을 때 제출 후 백준에서 시간초과가 떠 멘붕현상을 일으킵니다.
왜 ???????????????
input()
input()은 raw_input()을 evaluate한 결과를 반환한다고 합니다. 한국말로 번역하자면
해당 함수에 인자가 존재한다면 개행 없이 표준 출력에 기록됩니다.
인자가 없다면 입력으로부터 한 줄을 읽고 문자열로 변환 후(개행제거 후) 반환합니다.
이 과정을 요약하자면 다음과 같습니다.
input() : 사용자의 입력을 받고 → 문자열로 변환 → 추가 strip 진행 과정을 거치게 됩니다.
input()은 한편 사용자로부터 입력을 받기 전 대기를 위한 prompt를 가지고 있습니다. 때문에 많은 여러줄의 입력을 받는 경우에는 한줄 입력을 받기 -> 단계 수행 -> 대기(prompt) 를 반복하게 됩니다.
sys.stdin.readline()
stdin 은 standard input을 뜻합니다. input()과 비슷한 기능을 수행하지만 약간 다릅니다. 해당 함수를 사용하기 위해선 sys를 import해야합니다.
sys.stdin.readline()은 사용자의 입력을 받지만 개행 문자도 입력을 받을 수 있습니다. 또한 입력 크기에 제한을 줌으로써 한번에 읽어들일 문자의 수를 정할 수 있습니다. 그 문자의 수는 readline함수의 인자로 들어갈 수 있습니다.
num = sys.stdin.readline(2) # 입력 : 1234 print(num) # 결과 : 12
input()과 가장 큰 차이점은 input() 은 내장 함수로 취급되는 반면 sys 에 속하는 메소드들은 외부에서 import하여 사용하기 때문에 file object로 취급됩니다. 즉, 사용자의 입력만을 받는 buffer를 하나 만들어 그 buffer에서 따로 읽어들이는 것입니다.
input()은 더 이상 입력이 없는데도 수행될 경우 EOFerror를 뱉어내는 반면 sys.stdin.readline()은 빈 문자열을 반환합니다.
해결방법
알고리즘 최적화를 전제로 input() 대신 sys.stdin.readline()을 이용합니다.
해당 문제는 input()으로 입력을 받고 처리했을 때 시간초과가 납니다.
이를 입력부분만 sys.stdin.readline()으로 교체해주면 AC를 낼 수 있습니다.
Code
import sys
testCase = 3
while testCase:
n = int(sys.stdin.readline())
s = 0
for i in range(0,n):
a = int(sys.stdin.readline())
s += a
if s > 0:
print('+')
elif s < 0:
print('-')
else:
print('0')
testCase -= 1
참고링크
python documentation - input()
velog.io/@gouz7514/%ED%8C%8C%EC%9D%B4%EC%8D%AC-input-vs-sys.stdin.readline
'Python' 카테고리의 다른 글
(Python3) - 프로그래머스(PCCP_기출문제) : 1번 동영상 재생기 (1) | 2024.10.02 |
---|---|
(Python 오류) - TypeError : list indices must be integers or slices, not float (2) | 2019.03.27 |
파이썬(python)-백준(baekjoon)(BaekJoon)코딩 10430번:나머지 답 (0) | 2016.10.04 |
Day _03_04_파일 읽는 법:with open과 as (2) | 2016.10.02 |
print(i , end = ' ')가 안될 때 (0) | 2016.10.01 |