알고리즘 문제를 풀 때 입력 속도는 매우 중요하다. 특히, 입력 데이터가 많으면 Scanner와 BufferedReader 중 어떤 것을 사용하느냐에 따라 실행 시간이 크게 차이 나서 시간 초과가 날 수도 있다.
📌 결론부터 말하면?
→ 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));
}
}
'Java > 알고리즘' 카테고리의 다른 글
[Java] 자바 알고리즘 풀 때 int vs long 언제 써야할까? (0) | 2025.03.23 |
---|---|
자료구조 (ArrayList, HashMap, Stack, Queue, Deque) (0) | 2025.03.12 |