[백준] StringBuilder / StringTokenizer / BufferReader / BufferWriter

2025. 1. 13. 00:13CS/BaekJoon

오늘은 Java 로 백준 문제를 풀면서 많이 마주치게 된 내용들에 대해 정리해보려고 한다.

 

BufferReader 와 BufferWriter 

백준 문제를 풀다보면 시간제한이 걸려있는 문제들을 많이 마주하게 된다.

실제로도 여러 문제들을 풀면서 시간제한을 이유로 오답처리 된 경우가 많았다.

 

구글을 통해 찾아보니...

기존에 Scanner 를 이용하여 입력받던 문제로 인하여 시간 초과가 발생하는 경우가 있었다.

 

이런 문제를 해결하기 위해서는 BufferReader 와 BufferWriter 를 사용해야 한다.

먼저, 위 두개의 원리는 쉽게 말하면 바로바로 입출력을 하는 것이 아니라,

네트워크에서처럼 버퍼에 입출력들을 저장해두고 가득 찬 경우 혹은 개행 문자의 경우 버퍼에 있는 내용들을 입출력한다.

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

String inp = br.readLine();
bw.write(inp);
bw.flush();
bw.close();

 

위의 경우처럼 사용하고 꼭 flush 와 close를 마지막에 해주면 된다.

 

그러나 여기서 알아야 할 점은 readLine 메소드의 경우 문자로 입력을 받기 때문에 정수값으로 저장을 하려면?

BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

int inp = Integer.parseInt(br.readLine());
bw.write(inp);

 

Integer.parseInt 를 이용하여 변환해주어야 한다.

 

StringTokenizer

StringTokenizer 의 경우 일단 문자로 입력을 받고 이것을 split 메소드를 사용하지 않고 분리할 수 있다.

StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int cnt = st.countTokens(); //st 가 몇개의 분리된 문자를 가지고 있는지

for(int i = 0; i<cnt; i++){
	System.out.println(st.nextToken());
}

 

위 코드는 일단 br.readLine 을 이용하여 얻은 문자열을 공백 기준으로 분리하여 st에 담는 코드이다.

분리된 코드들은 배열처럼? 저장되어 있다. 이후 반복문을 통해 nextToken() 메소드를 이용하여 출력해준다.

st의 요소 개수는 변하므로 countTokens 를 통해 초기 개수를 저장해두고 쓰면 된다.

 

StringTokenizer 는 반환 타입이 배열이 아니라 문자열인 경우

구분자가 한문자 인 경우와 구분자에 유니코드 문자가 없고 길이가 길지 않을때 사용하는 것이 적합할 것이다. [1]

 

 

StringBuilder [2]

StringBuilder 의 경우 긴 문자열을 더하는 경우 적합하다.

StringBuilder sb = new StringBuilder();

sb.append("hello")

System.out.println(sb);

 

개인적으로 시간제한이 걸려있는 백준 큐 문제에서 유용하게 사용하였다. (28279번)

 

 

 

 

 

 

 

참고자료

[1] https://velog.io/@effirin/Java-StringTokenizer와-Split-메서드-언제-써야할까

[2] https://velog.io/@rara_kim/Java-StringBuilder-사용법