[백준 15552 파이썬] 빠른 A+B - 반복문 (for, 빠른 입력 feat. sys.stdin.readline)
[백준 15552 파이썬] 빠른 A+B - 반복문(for, 빠른 입력 feat. sys.stdin.readline)
안녕하세요.
또... 또 지겨운 A+B입니다. 오늘은 간단히만 짚고 넘어가죠. 새로운 그리고 input() 보다 빠른 입력 방법인 sys.stdin.readline().을 배우는 정도로만 이해하시면 될것 같습니다. 코딩 테스트를 위해서는 필수적 기능이라고 하니 높은 곳을 목표로 하시는 분들은 꼭 짚고 넘어가셔야겠죠!
문제
본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.
Python을 사용하고 있다면, input 대신 sys.stdin.readline을 사용할 수 있다. 단, 이때는 맨 끝의 개행문자까지 같이 입력받기 때문에 문자열을 저장하고 싶을 경우 .rstrip()을 추가로 해 주는 것이 좋다.
또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.
입력
첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.
출력
각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.
문제 분석
문제 자체는 A+B 덧셈을 하는 것으로 'A+B -3' 포스팅과 크게 다르지는 않습니다. 하지만 문제 맨 위에 '시간 제한' 1초가 왠지 찝집하지 않으셨나요?
그리고 입력 설명에 테스트케이스 T가 최대 백만개...이면 1초 안에 계산하려면 개당 백만분의 1 이하의 속도로 계산되어야 하는군요... 사실 가능한 것인지 불가능한 것인지 감이 잘 오지 않습니다. 이럴 땐 일단 익숙한 방법으로 해봐야겠죠.
input()으로 들이대봅니다.
결과는 시간 초과... 생소하네요.
문제를 잘 보시면 "input 대신에 sys.stdin.readline을 사용하라, rstrip을 추가로 해주는 것이 좋다"는 등의 알쏭달쏭한 문구가 적혀 있습니다. (앞의 C++, JAVA 이야기는 눈을 질끈 감고 넘어갑시다.)
sys.stdin.readline을 사용하기 위해서는 sys 모듈을 import 해주어야 합니다. stdin은 'standard input'이라는 뜻입니다. 표준 출력이겠네요. readline은 읽어오라는 뜻이겠죠!
예시를 통해 input() 함수와 비교해 볼까요? sys.stdin.readline은 "hello" 뒤에 입력을 위해 누른 엔터키까지 한줄 띄워 출력해버립니다. print문을 사용하지 않을 경우 개행문자 '\n'이 출력되는게 보이시죠? input 함수는 입력을 위해 친 엔터키는 문자열이 아닌 것으로 인식하고 배제시킵니다. 약간 가공이 들어가는거죠.
한가지 실험을 더 해봅시다. 바로 prompt message를 넣는 것인데요. 통상 input은 정수형 변수를 넣을 때 앞에 특정 문자열을 함께 표시할 수 있고, 해당 문자열은 입력 창에만 뜨고 값으로 저장되지는 않습니다. sys.stdin.readline에서는 엔터까지도 문자열로 인식하므로 당연히 문자열을 입력하고 정수형으로 변환하면 오류가 발생하게 되죠!
정리하자면, input은 입력하는 값에 대해 prompt message나 개행문자 처리 등 가공을 거쳐 의도한 값만 return하는 고급 언어 (사람에 가까운)적인 함수이며, sys.stdin.readline은 입력하는대로 메모리에 때려넣는 저급 언어 (기계에 가까운) 입력 기능으로 이해하시면 좋을 것 같습니다. 당연히 가공을 거치지 않은 sys.stdin.readline 처리가 더 빠르겠죠!
(이해를 돕기위한 간략한 설명으로, 전문적인 내용은 추가적인 스터디를 진행하시기 바랍니다.)
참고로 sys.stdin.readline은 Jupyter Notebook과 같은 IDLE에서 잘 작동하지 않아서 파이썬 콘솔을 통해 예시를 보여드렸습니다.
답안
이제 답안을 살펴보도록 하죠. 사실 input이 sys.stdin.readline으로 바꾼거 외에는 이전 문제와 달라진게 없는 듯 합니다. (사실 테스트케이스 'T' 부분은 반복되지 않으므로 input을 사용해도 무방합니다)
참고로, rstrip()은 문자열 오른쪽에 있는 공백(' ')이나 개행문자('\n')를 제거하는 메서드입니다. sys.stdin.readline().rstrip() 과 같이 사용할 수 있죠! (r은 right 의미) 이번 문제에서는 정수형 (int)로 변환시키면서 개행문자가 정리되므로 불필요한 것으로 생각되네요! (참고의 참고: lstrip은 왼쪽 (left), strip은 양쪽 제거)
이만 마치도록 하겠습니다.
읽어주셔서 감사합니다.