PS/이론

당신이 PS에서 Scanner를 쓰면 안 되는 이유 (JAVA)

제이온 (Jayon) 2020. 9. 16.

안녕하세요? 코딩중독입니다.

이번 시간에는 Java로 PS를 할 때, Scanner와 System.out.println을 쓰면 안 되는 이유를 알아보겠습니다.

 

흔히 Java는 느리다는 말을 많이 듣습니다. 실제로 PS에서 C, C++에 비해서 느린 것이 확실하지만, PS를 못할 정도로 느리진 않습니다. 다만, 입력과 출력을 할 때, Scanner와 System.out.println를 사용하면 같은 로직이어도 시간이 굉장히 오래 걸리거나 심지어 시간 초과 현상을 겪을 수도 있습니다.

 

특히 백준 "15552번 빠른 A+B" 문제에서 늘상 하던 대로 위의 문법을 사용하면 시간초과를 맞이하게 됩니다.

 

 

 

15552번: 빠른 A+B

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

www.acmicpc.net

 

 

Java를 처음 배우고 위 문제를 풀려고 하면, 아마 아래와 같은 소스코드를 짤 것입니다.

 

 

 

 

이해하기도 편하고 아주 직관적인 것을 알 수 있습니다.

하지만, 이것을 그대로 제출하게 되면 시간 내에 돌아가지 않게 됩니다.

 

 

 

 

이를 해결하려면 BufferedReaderd와 BufferedWriter를 사용해야합니다.

위 문법을 사용하여 얼마나 시간이 단축될 수 있는지 설명하기 위해서 아래 링크를 참고하였습니다.

 

 

 

입력 속도 비교

여러가지 언어와 입력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 첫째 줄에 정수의 개수 N (= 10,000,000), 둘째 줄부터 N개의 줄에 한 개의 자연수(10,000 이하)가 적힌 파일��

www.acmicpc.net

 

 

 

출력 속도 비교

여러가지 언어와 출력 방법을 이용해서 시간이 얼마나 걸리는지 비교해 보았습니다. 방법: 총 N개의 줄에 1부터 10,000,000까지의 자연수를 한 줄에 하나씩 출력하는 시간을 측정. 10번 측정해서 평�

www.acmicpc.net

 

 

아래는 위 사이트에서 표를 일부 발췌하여 첨부한 내용이며, 자세한 시간 측정 기준은 사이트를 참고하시길 바랍니다.

 

 

입력 속도 비교

 

 

입력에 경우, BufferedReader를 사용하면 흔히 빠르다고 생각하는 C의 scanf 보다도 빠르다는 사실을 알 수 있습니다.

 

 

 

 

반면, Scanner를 사용하면 BufferedReader에 비해 약 8배 정도 느리다는 것을 알 수 있습니다. 참고로 이 표를 보면, 파이썬도 꽤나 느린 언어라는 것을 짐작하실 수 있을겁니다.

 

 

 

이제, 출력 속도를 비교해 봅시다. 

 

 

출력 속도 비교

 

 

 

마찬가지로, BufferedWriter를 사용하면 C의 fwrite에는 미치지 못하더라도 충분히 C/C++ 계열의 출력 함수 속도와 어깨를 나란히 할 수 있게 됩니다.

 

 

 

 

반면에, System.out.println을 사용하면 약 3배가 느립니다. 42등의 Python3 출력 함수와 넘사벽이 하나 있고, 거의 꼴찌 경쟁을 다툴 정도로 매우 매우 느립니다.

 

특이한 점은 C++을 처음 배울 때 출력 함수로서 사용하는 'cout << i << endl' 이 생각보다 많이 느리다는 것에는 적잖이 놀랐습니다.

 

 

정리

이제, 우리는 수치를 통해서 'PS'에서 Scanner와 System.out.println을 사용하면 안 되는 이유를 이해하였습니다.

그리고 느리다고 까이는 Java도 BufferedReader와 BufferedWriter를 통해서 C/C++ 만큼은 아니더라도 실행 속도를 향상시킬 수 있다는 점을 알 수 있었습니다.

 

다음 시간에는 본격적인 BufferedReader와 BufferedWriter의 사용 방법을 설명하도록 하겠습니다.

 

 

지적 혹은 조언 환영합니다! 언제든지 댓글로 남겨주세요.

댓글

추천 글