백준, 프로그래머스 , codeforce, leetcode같은 online judge에서 문제를 풀다가 입출력부분에서 시간초과가 나는 경우가 꽤 흔하다. 심지어 입출력을 빠르게 수행하도록 하는 코드부분만 바꿨을때 맞는 경우도 존재한다.
이를 해결할 방법과 이유에 대해 알아보자.
input()은 raw_input()을 evaluate한 결과를 반환.
인자가 없다면 입력으로부터 한 줄을 읽고 문자열로 변환 후(개행제거 후) 반환한다.
이 과정을 요약한다면,
input() : 사용자의 입력을 받고 → 문자열로 변환 → 추가 strip 진행 과정을 거치게 된다.
input()은 한편 사용자로부터 입력을 받기 전 대기를 위한 prompt를 가지고 있습니다. 때문에 많은 여러줄의 입력을 받는 경우에는 한줄 입력을 받기 -> 단계 수행 -> 대기(prompt) 를 반복하게 된다 !!
stdin 은 standard input을 말한다. input()과 비슷한 기능을 수행하지만 약간 다르다. 해당 함수를 사용하기 위해선 sys를 import해서 사용해야 한다.
sys.stdin.readline()은 사용자의 입력을 받지만 개행 문자도 입력을 받을 수 있는 장점이 있다. 또한 입력 크기에 제한을 줌으로써 한번에 읽어들일 문자의 수를 정할 수 있습니다. 그 문자의 수는 readline함수의 인자로 들어갈 수 있다.
sys.stdin.readline(5)
→ 문자의 개수를 조정할 수 있다.
알고리즘 최적화를 전제로 input() 대신 sys.stdin.readline()을 이용하자.
+++ input = sys.stdin.readline을 설정했을 때
data = input().rstrip()로 읽어준다.(문자열을 읽을 때는 꼭 이렇게 !!)
input = sys.stdin.readline
을 코드 제일 위에 추가한다면, input이 sys.stdin.readline의 속도를 갖게 된다.