당신이 PS에서 Scanner를 쓰면 안 되는 이유 (JAVA)
목차
안녕하세요? 코딩중독입니다.
이번 시간에는 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를 처음 배우고 위 문제를 풀려고 하면, 아마 아래와 같은 소스코드를 짤 것입니다.
import java.util.Scanner; | |
public class Main { | |
public static void main(String[] args) { | |
Scanner scan = new Scanner(System.in); | |
int N = scan.nextInt(); | |
for (int i = 1; i <= N; i++) { | |
int A = scan.nextInt(); | |
int B = scan.nextInt(); | |
System.out.println(A + B); | |
} | |
} | |
} |
이해하기도 편하고 아주 직관적인 것을 알 수 있습니다.
하지만, 이것을 그대로 제출하게 되면 시간 내에 돌아가지 않게 됩니다.

이를 해결하려면 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의 사용 방법을 설명하도록 하겠습니다.
지적 혹은 조언 환영합니다! 언제든지 댓글로 남겨주세요.
'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 |
댓글