개발일기/CS(면접)

Scanner 차이 BufferedReader

w.llama 2024. 12. 18. 11:59

문제 [백준] 빠른 A+B 를 마주하기전까지 필자는 항상 java에서 입출력 을 받을때 Scanner를 사용하여 푸는 습관이있었다.
백준 빠른 A+B을 만나기 전까지 BufferedReader 와 BufferedWriter에 대해 알지도 못했는데
관련하여 정리해보려고한다.

왜 Scanner는 컴파일 시간이 오래 걸릴까?

자바에서 입출력을 받을 때 자연스럽게 Scanner를 사용해왔다. 하지만 [백준] 빠른 A+B 문제를 만나면서 BufferedReader와 BufferedWriter의 존재를 알게 되었다.
그래서 이번 기회에 Scanner와 BufferedReader의 차이점을 정리하고, 왜 Scanner를 사용하면 컴파일 시간이 오래 걸리는지 알아보려고 한다.

Scanner의 동작 방식

Scanner는 다음과 같은 방식으로 입력을 받는다.

Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = sc.nextInt();
System.out.println(a + b);

하지만, Scanner는 내부적으로 입력 값을 한 글자씩 읽어가면서, 공백/줄바꿈 등을 기준으로 파싱을 수행한다.
즉, 입력 스트림을 읽을 때마다 내부적으로 정규식을 사용하여 데이터를 분석하는 과정이 포함되므로, 속도가 느릴 수밖에 없다.

특히, 백준 같은 온라인 저지 시스템에서 대량의 입력을 처리할 때 속도가 문제가 된다.

BufferedReader의 동작 방식

반면, BufferedReader는 한 줄을 통째로 읽고, 필요한 데이터만 직접 가공하는 방식을 사용한다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken()); System.out.println(a + b);

이 방식은 정규식 분석이 없고, 한 번에 대량의 데이터를 읽을 수 있기 때문에 훨씬 빠르다.
특히 StringTokenizer를 사용하면 공백을 기준으로 빠르게 데이터를 분리할 수 있다.

Scanner vs BufferedReader 속도 비교

방식 장점 단점
Scanner 사용이 편리함 (nextInt(), nextLine() 등 지원) 속도가 느리고, 정규식 분석이 포함되어 비효율적
BufferedReader 속도가 빠르고 대량의 데이터 처리에 유리 Integer.parseInt()를 직접 사용해야 해서 코드가 길어질 수 있음

Scanner는 간단한 프로그램이나 적은 양의 데이터를 처리할 때 유용하지만,
BufferedReader는 백준과 같은 온라인 저지 시스템에서 빠른 입출력이 필요한 경우 필수적이다.

결론: 백준에서 빠른 A+B를 해결하려면?

  • Scanner는 편리하지만 속도가 느리다.
  • BufferedReader는 빠르지만 데이터 파싱을 직접 처리해야 한다.
  • 백준 같은 대량 입출력이 필요한 문제에서는 반드시 BufferedReader를 사용하는 것이 유리`

이제부터는 Scanner만 쓰던 습관에서 벗어나, 문제 상황에 따라 적절한 입출력 방식을 선택하는 것이 중요하다는 점을 기억해야겠다.

'개발일기 > CS(면접)' 카테고리의 다른 글

브루트 포스 (Brute Force) 알고리즘이란?  (0) 2025.01.24
StringTokenizer 와 split과 차이점  (0) 2024.12.26
자료구조 정리  (0) 2024.10.19
Junit5, Mockito 사용하기  (0) 2024.09.30
Spring Security 동작 과정  (0) 2024.09.24