코드업 기초 100제의 1084번 문제를 풀다가 알게된 것이다.
코드 상으로는 틀린 점이 없으나, Scanner의 느린 속도로 인해 시간 초과로 실패했던 문제다.
Scanner sc = new Scanner(System.in)
.useDelimiter()
메서드를 사용해 원하는 구분자로 입력을 나눌 수 있음 (디폴트 구분자는 '공백')Java를 사용하면서 '사용자에게 입력 받으세요'가 나오면 무조건 Scanner 클래스를 사용했다.
그러나 이 클래스의 속도가 느리다는 것을 인지하지 못했다.
내가 사용한 BufferedReader
는 문자열을 한 문자씩 읽어 들이는 InputStreamReader
에 버퍼링 기능이 추가된 클래스이다.
긴 문자열을 Character 단위로 읽어 들일 경우 시간, 비용 측면에서 비효율적이라 이를 보완하고자 한 것이 BufferedReader
이라는 것
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedReader
를 사용하는 것이 좋음BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
BufferedWriter
를 사용하는 것이 좋음데이터 전송의 효율을 위해 ❗
입력된 문자의 정보를 버퍼링 없이 목적지로 바로 이동하는것 보다 이동 과정 중간에 메모리 버퍼를 두고, 데이터를 한 곳에 묶어 이동시키는 것이 효율적이고 빠르다.
두 입력 클래스의 메모리 점유는 대략 2배, 시간 속도 차이는 10배 가까이... 어마어마한 차이가 난다
문제 통과도 중요하지만 불필요한 메모리 사용, 느린 속도에 대해서도 신경써야함을 알게된 문제다 🧐
참고자료
Java SE 11 & JDK 11 Docs - Class Scanner
Java SE 11 & JDK 11 Docs - Class BufferedReader
Java SE 11 & JDK 11 Docs - Class BufferedWriter
BufferedReader와 Scanner