Baekjoon

[Java/Algorithm] BufferedReader vs. Scanner 분명한 속도 차이!

dev_haha 2023. 11. 9. 17:06

[Scanner]

  • 직관적이고 내장 메소드가 많아서 활용성이 높다.
  • 키보드로부터 입력받은 즉시 메모리 전송!
  • 띄어쓰기와 개행문자(엔터)를 기준으로 입력 값 인식

사용법

객체생성 - 입력값 받기 - 리소스 닫기

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
 		// Scanner 객체 생성
		
		int n = sc.nextInt();
		 // 정수형 입력값 받을 땐 nextInt() 
		
		System.out.println(n);
		
		sc.close();
		// 리소스 닫기
	}
	
}

 

 

[BufferedReaer]

  • 버퍼를 거쳐서 메모리 전송!
  • 키보드의 입력을 바구니(버퍼)에 차곡차곡 모아두었다가
  • 한번에 쑝 전송하기 때문에 버퍼링이 없음!
  • 개행문자로 경계 인식
  • 입력 데이터값은 String으로 고정이기 때문에 데이터 가공 필수!

사용법

import java.io.*;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int N = Integer.parseInt(br.readLine());
		
		for (int i = 0; i < N/4; i++)
			sb.append("long ");
		
		System.out.println(sb.append("int").toString());
	}
	
}

대부분 학교나 학원에서는 Scanner를 주로 사용한다. (간단하니까)

하지만 백준 문제 상위권 소스코드를 보면 대부분 BufferedReader를 사용하여 성능과 속도를 챙기고 있다.

 

실제 예시

내가 푼 문제 예시를 보면

백준 25314 - 코딩은 체육과목입니다.

위가 BufferedReader 사용
아래가 Scanner 사용

코드의 길이는 414B,415B로 비슷하지만

메모리와 시간의 차이를 보면 확 느껴지는 성능차이!