상세 컨텐츠

본문 제목

BufferedReader / Scanner 의 속도차이

알고리즘/개념 및 TIP

by Chan.94 2021. 9. 15. 14:11

본문

반응형

BufferedReader는 알고리즘 문제를 풀다 보면 접하게 된다.

필자도 처음에는 Scanner를 이용하여 알고리즘 문제를 풀었으며 시간 초과가 나서 다른 사람들의 풀이를 참조하다 알게 되었다.

 

BufferedReader와 Scanner의 가장 큰 차이는 속도이다.

 


BufferedReader

출처 : https://algospot.com/forum/read/2496/

 

Scanner와 BufferedReader의 속도 차이가 나는 것을 확인할 수 있다.

 

BufferedReader는 사용자의 요청이 있을 때 데이터를 읽어오는 것이 아니라 데이터를 한 번에 읽어와 버퍼에 보관한 후 버퍼에서 데이터를 읽어오는 방식이다.

보통 readLine() 메소드를 사용하여 라인 단위로 입력을 받아 split 또는 StringTokenizer를 사용한다.

 

사용방법

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

필자도 왜 이렇게 사용해야 하는지 몰라서 정리하고자 한다.

 

1) InputStream

InputStream in = System.in

InputStream은 가장 기본적인 입력 스트림(byte 단위)이다.

read()를 통해 1byte씩 읽어드릴 수 있다.

 

InputStream in = System.in

byte[] a = new byte[10];
in.read(a);

 

2) InputStreamReader

InputStreamReader in = new InputStreamReader(System.in);

InputStreamReader는 byte단위의 InputStream을 문자 단위(char 단위)로 변경시키는 작업을 한다.

 

InputStreamReader sr = new InputStreamReader(System.in);
	
char[] c = new char[10]
sr.read(c);

 

3) BufferedReader

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

1), 2)를 통해 입력 데이터가 문자 단위(char 단위)가 되었다.

만약 문자열을 입력하고 싶다면 매번 배열을 선언해야 한다는 단점은 그대로다.

그래서 Buffer를 통해 쌓아 둔 뒤 문자열처럼 보내주는 것이다.

 

그래서 우리는 readLine() 메소드를 자주 사용하는 것이다.

 


 

BufferedReader보다 Scanner가 느린 이유

1. Buffer Size차이

구분 Buffer Size
Scanner 1024byte (1KB)
BufferedReader 8192btye (8KB)

Buffer란 데이터를 이동시키기 위한 그릇으로 이해하면 좋다. Buffer를 자동차라 생각해보자.

승용차로는 서울에서 부산까지 5명이 이동할 수 있지만, 버스를 이용하면 40명이 이동할 수 있다.

 

2. 파싱, 정규식 사용

Scanner는 입력을 읽는 과정에서 정규식 적용, 파싱 과정을 거친다.

예를 들어 Scanner.nextInt()는 "1,000,000"의 입력 또한 정수 1000000으로 받아들인다.

 

BufferedReader는 String으로만(데이터를 파싱 하지 않고) 읽어드린다.

 

속도 차이는 파싱, 정규식 사용에 의해 발생한다고 할 수 있다.

반응형

'알고리즘 > 개념 및 TIP' 카테고리의 다른 글

퀵 정렬 (Quick Sort) - middle pivot  (0) 2024.11.22
그리디(Greedy) 개념  (0) 2022.02.11
DFS / BFS 개념  (1) 2021.10.28
'에라토스테네스의 체' 개념  (0) 2021.09.26

관련글 더보기

댓글 영역

>