[ 백준 문제 15552 / 파이썬 ] 빠른 A+B

2023. 2. 5. 19:14백준/파이썬

 

15552번: 빠른 A+B

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

www.acmicpc.net

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

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

또한 입력과 출력 스트림은 별개이므로,
테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다.
테스트케이스를 하나 받은 뒤 하나 출력해도 된다.

 

반복문을 통해 여러줄을 입출력 할 때 그 방식이 느리면시간초과가 난다고 합니다.

지금까지 입력을 받을 때 input()만 써봤는데, input()을 사용하면 몇가지 이유로 입력이 느려질 수 있다고 합니다.

input() 대신 sys.stdin.readline()을 사용하면 실행속도가 완화됩니다.

 

더 자세히 알아볼까요?

input()과 sys.stdin.readline() 차이

1. input()은 내장함수이고 sys.stdin은 file object입니다.

=> sys.stdin.readline()은 사용자의 입력이 들어오면 한번에 버퍼에 보관하고  필요할 때 버퍼에서 읽어줍니다.
input()은 입력이 들어오면 일일이 읽어와줘야 하기 때문에 상대적으로 느립니다.

2. sys.stdin.readline()은 개행문자(\n)가 입력 끝에 포함되어 있다는 점에서 input()과 다릅니다.

=> input은 줄바꿈 제거해서 값을 반환하는 반면에,
sys.stdin.readline()은 출력될 때 줄바꿈 제거가 안돼서 한 줄이 띄어져서 나옵니다.

여기서 .strip()을 붙여서
 sys.stdin.readline().strip() 이런식으로 출력하면, 줄바꿈을 제거할 수 있습니다.

3. input()은 파라미터로 promt message를 받을 수 있으나,
sys.stdin.readline()은 파라미터로 promt message를 받지 않습니다.

=> input()은 입력을 받기 전 promt message를 출력해야합니다.
prompt message를 필요로 하지 않는 경우에
sys.stdin.readline()을 사용하면 prompt message를 출력하는 과정을 생략할 수 있기에 속도가 빨라집니다.

* prompt message란 input("입력해주세요. : ") 처럼 입력 받기 전 뜨는 메시지를 뜻합니다.

즉 더 빠른 실행속도를 원한다면, sys.stdin.readline()으로 입력값을 받아오는 게 좋겠군요.

4. input()은 파일의 끝이면 EOF에러를 발생시키나, sys.stdin.readlines()은 파일의 끝까지 가져올 수 있습니다.

 

 

TIP . jh05013

rstrip을 하라는 건 문자열 자체를 변수에 저장하고 싶을 때 얘기지,
개행문자가 맨 끝에 들어와도 int 변환이나 split()을 그대로 할 수 있습니다.

즉 int(sys.stdin.readline()), sys.stdin.readline().split() 이렇게 해도 아무 문제 없습니다.
참고로 이름이 꽤 길기 때문에 저는 input = sys.stdin.readline을 맨 처음에 함으로써 쓰는 편입니다.

 

나의 정답 :

 

방법 1)

import sys

T = int(sys.stdin.readline())

for i in range(T):
    A, B = map(int, sys.stdin.readline().split())
    print(A+B)
5
1 1
2
12 34
46
5 500
505
40 60
100
1000 1000
2000

 

처음 써봐서 import 없이 sys.stdin.readline() 적으니까

name 'sys' is not defined라는 네임 에러가 발생했는데,

 

import sys로 모듈을 불러와주니까 해결 됐습니다!

 

방법 2)

import sys

input = sys.stdin.readline
T = int(input())

for i in range(T):
    A, B = map(int, input().split())
    print(A+B)
5
1 1
2
12 34
46
5 500
505
40 60
100
1000 1000
2000

 

팁대로

sys.stdin.readline 너무 기니까 input에 먼저 할당해주고

이전에 쓰던대로 input()을 이용해줬습니다.

 
훨씬 편하네요 ! :)