2025. 1. 13. 00:13ㆍCS/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-사용법