< 백준 - 15552 > 

백준 15552번 이름은 '빠른 A+B'이다.

문제
본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다. 

Python을 사용하고 있다면, input 대신 sys.stdin.readline 을 사용할 수 있다. 단, 이때는 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다. 

rstrip을 하라는 건 문자열 자체를 변수에 저장하고 싶을 때 얘기지, 개행문자가 맨 끝에 들어와도 int 변환이나 split()을 그대로 할 수 있습니다. 즉 int(sys.stdin.readline()), sys.stdin.readline().split() 이렇게 해도 아무 문제 없습니다. 참고로 이름이 꽤 길기 때문에 저는 input = sys.stdin.readline을 맨 처음에 함으로써 쓰는 편입니다. (출처 : acmicpc)

입력
첫 줄에 테스트 케이스 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A, B가 주어진다. A, B는 1 이상 1,000 이하이다. 

출력
각 테스트 케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다. 




< 출력은 제대로 되지만, 시간초과로 오답인 코드 > 


1
2
3
4
T = int(input())
for i in range(T):
    A, B = map(int, input().split())
    print(A+B)

이 코드 시간초과로 오답이다.

문제를 다시 꼼꼼히 읽어보자. 입출력 방식이 느린 input( ) 대신 sys.stdin.readline을 사용하라고 돼 있다. 만약 T가 1,000,000이라면 3번 줄에 input( )이 1,000,000번 반복될 것이다. 이때 for문을 빨리 돌려주기 위해 input( ) 보다는 sys.stdin.readline이 더 좋은 코드라는 걸 알 수 있다.


< sys.stdin.readline 을 사용한 정답 코드 > 


1
2
3
4
5
import sys
T = int(input())
for i in range(T):
    a, b = map(int, sys.stdin.readline().split())
    print(a + b)

제일 먼저 sys 모듈을 import 해주는데, sys 모듈은 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모델이다. (<점프 투 파이썬>에서 자세히 알아보기) 


sys.stdin.readline을 이용해 풀어야 하는 또 다른 백준 문제가 있다. 

백준 2751번 수 정렬하기2 문제다. 



< 내 코드 >



1
2
3
4
5
6
7
8
import sys
N = int(input())
my_list = []
for i in range(N):
    my_list.append(int(sys.stdin.readline()))

for i in sorted(my_list):
    print(i)


dddd