Java/알고리즘

빠른 입력 (Scanner vs BufferedReader)

댕주 2025. 3. 12. 22:48

알고리즘 문제를 풀 때 입력 속도는 매우 중요하다. 특히, 입력 데이터가 많으면 ScannerBufferedReader 중 어떤 것을 사용하느냐에 따라 실행 시간이 크게 차이 나서 시간 초과가 날 수도 있다.

📌 결론부터 말하면?
Java는 기본적으로 입력이 느리기 때문에 BufferedReader를 쓰는 것이 좋다!
→ 단순한 문제에서는 Scanner도 괜찮지만, 대부분의 경우 BufferedReader + StringTokenizer 조합을 추천한다.

 

입력 방법 속도 장점 단점
Scanner 느림 공백 및 개행을 기준으로 쉽게 입력을 분리할 수 있음 내부적으로 정규 표현식 기반 파싱을 하기 때문에 속도가 느림
BufferedReader 빠름 버퍼를 활용하여 대량의 데이터를 빠르게 읽을 수 있음 입력을 문자열로만 받기 때문에 숫자 변환 과정이 필요

🔹 Scanner

- 공백 및 개행을 기준으로 쉽게 입력을 분리

- 정수(nextInt()), 문자열(next()), 실수(nextDouble()) 등 다양한 형식의 데이터를 쉽게 읽을 수 있음

- 내부적으로 입력 값을 읽을 때 정규 표현식을 사용해서 파싱하기 때문에 속도가 느림

- 입력을 받을 때마다 버퍼를 비운 후 한 글자씩 읽어서 처리

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        
        int n = sc.nextInt(); // 정수 입력
        String s = sc.next(); // 단어(공백 없는 문자열) 입력
        sc.nextLine(); // 개행 제거 (버퍼 비우기)
        String line = sc.nextLine(); // 한 줄 입력

        System.out.println(n + " " + s + " " + line);
    }
}

 

🔹 BufferedReader

- 버퍼를 사용하여 한 번에 입력을 처리하기 때문에 속도가 훨씬 빠름

- 한 줄 단위로 입력을 처리하기 때문에 대량의 데이터를 빠르게 읽을 수 있음

- 입력을 문자열(String)로만 받을 수 있음 -> Integer.parseInt()를 사용해야 함

- 공백을 기준으로 입력을 나누려면 StringTokenizer 또는 split()을 사용해야 함 (StringTokenizer 추천)

- split()은 내부적으로 정규 표현식을 사용하기 때문에 속도가 느릴 수 있음

- readLine()은 예외 처리 (IOException)을 반드시 해줘야 함

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

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        int n = Integer.parseInt(br.readLine()); // 정수 입력
        String s = br.readLine(); // 한 줄 입력

        // 공백으로 구분된 숫자 여러 개 입력 (ex. "10 20 30")
        StringTokenizer st = new StringTokenizer(br.readLine());
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());
        
        System.out.println(n + " " + s + " " + (a + b));
    }
}