본문 바로가기

Python

(Python) - 입출력 시간초과 해결법

반응형

 백준, 프로그래머스 , codeforce, leetcode같은 online judge에서 문제를 풀다가 입출력부분에서 시간초과가 나는 경우가 꽤 흔합니다. 심지어 입출력을 빠르게 수행하도록 하는 코드부분만 바꿨을때 맞는 경우도 존재합니다.

이를 해결할 방법과 이유를 설명드리겠습니다.

 

www.acmicpc.net/problem/1247

 

1247번: 부호

총 3개의 테스트 셋이 주어진다. 각 테스트 셋의 첫째 줄에는 N(1≤N≤100,000)이 주어지고, 둘째 줄부터 N개의 줄에 걸쳐 각 정수가 주어진다. 주어지는 정수의 절댓값은 9223372036854775807보다 작거나

www.acmicpc.net

해당 링크에 대한 코드로 설명하겠습니다.

 

먼저 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

 

참고링크

stackoverflow.com/questions/22623528/sys-stdin-readline-and-input-which-one-is-faster-when-reading-lines-of-inpu

python documentation - sys

python documentation - input()

velog.io/@gouz7514/%ED%8C%8C%EC%9D%B4%EC%8D%AC-input-vs-sys.stdin.readline