[Java] 백준 #10950 A+B - 3

Kitsun3·2025년 1월 17일

A와 B를 입력받아 그 합을 출력하는 간단한 문제입니다.
효율적인 입출력을 위해 기존의 Scannersplit() 대신, BufferedReaderStringTokenizer 를 활용한 새로운 접근을 시도해 보았습니다.


왜 BufferedReader를 선택했는가?

자주 사용하던 Scanner 클래스는 편리한 입력 처리 기능을 제공하지만, 상대적으로 느린 속도를 가지고 있습니다.
이는 입출력 처리 과정에서 동기화(synchronization)가 발생하기 때문인데요, 데이터가 많은 경우 실행 속도에 영향을 줄 수 있습니다.

반면, BufferedReader 는 버퍼(buffer)를 사용하여 데이터를 읽기 때문에 훨씬 빠른 속도를 제공합니다.
특히, 반복적으로 많은 데이터를 입력받고 처리해야 하는 문제에서는 그 차이가 더욱 두드러집니다.


왜 StringTokenizer를 선택했는가?

문자열을 특정 구분자(예: 공백, 콤마 등)로 나누는 작업에서 흔히 사용되는 split() 메서드는 내부적으로 정규표현식(Regular Expression)을 사용합니다. 이로 인해 코드가 간단해지는 장점이 있지만, 처리 속도가 느릴 수 있습니다.

반면, StringTokenizer는 단순한 구분자 처리에 특화되어 있어 더 빠르고 메모리 효율적입니다.
따라서, 문자열 분리가 단순한 문제에서는 split()보다 StringTokenizer를 사용하는 것이 유리합니다.


풀이

import java.io.*;
import java.util.StringTokenizer;

public class Main {

    public static void solution() throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int count = Integer.parseInt(br.readLine());

        StringTokenizer st;
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < count; i++) {
            st = new StringTokenizer(br.readLine(), " ");   // 각 줄을 공백으로 분리
            int a = Integer.parseInt(st.nextToken());
            int b = Integer.parseInt(st.nextToken());
            sb.append(a + b).append("\n");
        }

        br.close();
        System.out.println(sb);

    }

    public static void main(String[] args) throws IOException {
        solution();
    }
}

느낀 점 및 개선 가능성

  • 이번 문제에서는 효율적인 입출력 처리가 중요하지 않을 수도 있지만, 대규모 데이터 처리가 필요한 경우 이러한 최적화는 매우 유의미한 차이를 만들어낼 수 있습니다.
  • 또한, split()Scanner가 편리하다는 이유로 습관적으로 사용했지만, 효율성을 고려한 선택이 더 나은 코드로 이어진다는 점을 다시 한번 깨닫게 되었습니다.
  • 다만, 입력 데이터가 복잡한 구분자를 포함하거나 정규표현식을 사용하는 경우에는 여전히 split()이 더 적합할 수 있으므로 상황에 맞는 도구를 선택하는 것이 중요합니다.
profile
HELLO

0개의 댓글