당신이 PS에서 Scanner를 쓰면 안 되는 이유 (JAVA)
안녕하세요? 코딩중독입니다.
이번 시간에는 Java로 PS를 할 때, Scanner와 System.out.println을 쓰면 안 되는 이유를 알아보겠습니다.
흔히 Java는 느리다는 말을 많이 듣습니다. 실제로 PS에서 C, C++에 비해서 느린 것이 확실하지만, PS를 못할 정도로 느리진 않습니다. 다만, 입력과 출력을 할 때, Scanner와 System.out.println를 사용하면 같은 로직이어도 시간이 굉장히 오래 걸리거나 심지어 시간 초과 현상을 겪을 수도 있습니다.
특히 백준 "15552번 빠른 A+B" 문제에서 늘상 하던 대로 위의 문법을 사용하면 시간초과를 맞이하게 됩니다.
Java를 처음 배우고 위 문제를 풀려고 하면, 아마 아래와 같은 소스코드를 짤 것입니다.
이해하기도 편하고 아주 직관적인 것을 알 수 있습니다.
하지만, 이것을 그대로 제출하게 되면 시간 내에 돌아가지 않게 됩니다.
이를 해결하려면 BufferedReaderd와 BufferedWriter를 사용해야합니다.
위 문법을 사용하여 얼마나 시간이 단축될 수 있는지 설명하기 위해서 아래 링크를 참고하였습니다.
아래는 위 사이트에서 표를 일부 발췌하여 첨부한 내용이며, 자세한 시간 측정 기준은 사이트를 참고하시길 바랍니다.
입력 속도 비교
입력에 경우, 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의 사용 방법을 설명하도록 하겠습니다.
지적 혹은 조언 환영합니다! 언제든지 댓글로 남겨주세요.
'PS > 이론' 카테고리의 다른 글
이진 탐색(Binary Search) 알고리즘이란? (JAVA) (0) | 2020.10.22 |
---|---|
선형 탐색(Linear Search) 알고리즘이란? (JAVA) (0) | 2020.10.20 |
EOF의 사용 방법을 알아보자 (JAVA) (0) | 2020.10.19 |
BufferedReader와 BufferedWriter의 사용법 (JAVA) (0) | 2020.09.16 |
댓글