[Java]/문법, 자료구조, 알고리즘

Scanner vs BufferedReader

응파카 2023. 3. 16. 16:30

동아리 동기들과 스터디 그룹을 만들어 숙제 중 하나인 백준문제 풀이를 진행하던 도중 간단하게 생각했던 Stack 문제에서 시간초과가 발생했다.

띠용

옛날에도 비슷한 경험을 했던 적이 있어서 입력방법을 다르게 했더니 해결이 되었던 경험이 있었는데.. 싶어 찾아보니 Scanner 클래스보다 속도면에서 훨씬 우수한 BufferedReader 라는 것이 있다는 것을 알았다.

 

  Scanner BufferReader
패키지 java.util java.io
데이터 전송 타이밍 입력 받음과 동시에 즉시 전송. 개행문자 만날 때, Buffer 가득 찰 때 버퍼내용 한 번에 보냄.
속도 비교적 느림. 비교적 빠름.
데이터 파싱 별도의 형변환이 필요 없다. 모든 입력을 String으로 받으므로 별도의 형변환이 필요할 수 있다.
버퍼 크기 1KB 8KB
I/OException 직접 예외처리 할 필요가 없다. try-catch 나 throw를 통해 직접 예외처리 해줘야 한다.
thread safe thread unsafe thread safe

 

BufferReader를 사용하기 위해 알아두어야 할 사항으로는 다음이 있었다.

 

1. BufferedReader 가 Scanner 보다 속도면에서 훨씬 우수하다.

 

2. BufferedReader 는 모든 입력을 String으로 받기 때문에 형 변환을 명시적으로 해주어야 한다.

 

3. BufferedReader를 사용하기 위해선 IOException을 따로 처리해주어야 한다.

4. Scanner와 같이 BufferedReader 객체를 생성한 후 입력을 받을 수 있다.

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

 

5. 입력받는 방법은 다음과 같다.

String string = bufferedReader.readLine();
int i = Integer.parseInt(bufferedReader.readLine());

 

6. 만약 공백을 기준으로 입력을 나눠 받는다면 util 패키지의 StringTokenizer를 사용한다.

import java.util.*;

StringTokenizer stringTokenizer = new StringTokenizer(bufferReader.readLine());
String s1 = stringTokenizer.nextToken();
String s2 = stringTokenizer.nextToken();
String s3 = stringTokenizer.nextToken();

 

 

 

BufferedReader를 사용해 풀던 Stack 문제를 마저 구현하면 다음과 같다.

https://www.acmicpc.net/problem/10828

 

10828번: 스택

첫째 줄에 주어지는 명령의 수 N (1 ≤ N ≤ 10,000)이 주어진다. 둘째 줄부터 N개의 줄에는 명령이 하나씩 주어진다. 주어지는 정수는 1보다 크거나 같고, 100,000보다 작거나 같다. 문제에 나와있지

www.acmicpc.net

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

	static int n;
	static Stack<String> stack = new Stack<>();
	static StringBuilder answer = new StringBuilder();

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
		n = Integer.parseInt(bufferedReader.readLine());

		for(int i=0; i<n; i++) {
			StringTokenizer stringTokenizer = new StringTokenizer(bufferedReader.readLine());

			switch (stringTokenizer.nextToken()) {

			case "push" :
				stack.push(stringTokenizer.nextToken());
				break;

			case "pop" :
				if(stack.isEmpty()) {
					answer.append("-1\n");
					break;
				}
				else {
					answer.append(stack.pop() + "\n");
					break;
				}

			case "size" :
				if(stack.isEmpty()) {
					answer.append("0\n");
					break;
				}
				else {
					answer.append(stack.size() + "\n");
					break;
				}

			case "empty" :
				if(stack.isEmpty()) {
					answer.append("1\n");
					break;
				}
				else {
					answer.append("0\n");
					break;
				}

			case "top" :
				if(stack.isEmpty()) {
					answer.append("-1\n");
					break;
				}
				else {
					answer.append(stack.peek() + "\n");
					break;
				}

			default:
				break;
			}
		}

		System.out.println(answer);
	}

}

 


 

ref.

[JAVA 자바]입력받기 Scanner vs BufferedReader

'[Java] > 문법, 자료구조, 알고리즘' 카테고리의 다른 글

Heap  (0) 2023.03.21
Stack / Queue  (0) 2023.03.20
TreeSet, Red-Black Tree  (0) 2023.03.10
HashMap  (0) 2023.03.10
소수 (에라토스테네스의 체)  (0) 2023.03.10