[BOJ 1000] A+B 문제 - 다양한 Java 입력 방식으로 풀어보기
[BOJ 1000] A+B 문제 - 다양한 Java 입력 방식으로 풀어보기
문제 요약
- 문제: 두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램 작성
- 입력: 첫째 줄에 A와 B가 주어진다 (0 < A, B < 10)
- 출력: A + B 출력
- 예제 입력:
1 2
- 예제 출력:
3
1. Scanner 사용 (가장 기본적인 방식)
1
2
3
4
5
6
7
8
9
10
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int A = sc.nextInt();
int B = sc.nextInt();
System.out.print(A + B);
}
}
- 가장 쉬운 방식
- 단, 입력이 많을 경우 속도가 느릴 수 있음
2. BufferedReader + StringTokenizer (입력 속도 최강)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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));
StringTokenizer st = new StringTokenizer(br.readLine());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
System.out.print(A + B);
}
}
- 코딩 테스트에서 가장 많이 사용됨
- 빠르고 안정적이며 공백 기준 입력 분리도 용이함
3. BufferedReader + split() 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] input = br.readLine().split(" ");
int A = Integer.parseInt(input[0]);
int B = Integer.parseInt(input[1]);
System.out.print(A + B);
}
}
- StringTokenizer보다 문법이 직관적
- 성능은 살짝 떨어질 수 있음 (split 내부 정규식 처리 때문)
4. System.in.read() 사용 (가장 저수준 방식)
1
2
3
4
5
6
7
8
9
10
11
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
int A = System.in.read() - '0'; // '1' → 49 → 1
System.in.read(); // 공백
int B = System.in.read() - '0';
System.out.print(A + B);
}
}
- 빠르지만 위험한 방식
- A, B가 한 자리 정수일 때만 가능
- 실제 문제 조건이 (0 < A, B < 10)일 때만 사용 가능
📎 방식 비교표
방식 | 속도 | 쉬움 | 실전 추천 | 특징 |
---|---|---|---|---|
Scanner | 느림 | ✔️ | ❌ | 입문자용, 문법이 가장 간단함 |
BufferedReader + split | 빠름 | ✔️ | ✔️ | 직관적이지만 split 성능 이슈 |
BufferedReader + StringTokenizer | 매우 빠름 | △ | ✅✅ | 실전용, 빠르고 튼튼함 |
System.in.read() | 최고속도 | ❌ | ❌ | 조건 제한 크고 실수 유발 가능 |
마무리
- 자바는 입력 방식이 다양하지만, 상황에 따라 최적 선택이 중요
- 코딩 테스트에서는 Scanner보다 BufferedReader 계열이 더 적합함
- 속도, 문법 편의성, 입력 조건에 따라 유연하게 선택할 수 있어야 함
추천
입출력 성능과 close() 처리, 진짜 실전에서는?
코딩 테스트에서 속도는 정답 판별에 직접적인 영향을 줍니다.
특히 입력 데이터가 수천 줄을 넘어가는 경우 Scanner
로는 시간 초과가 날 수 있어요.
BufferedReader는 왜 빠를까?
BufferedReader
는 입력을 한 글자씩 읽지 않고, 버퍼에 모아 한 번에 처리합니다.- 그래서 반복문 안에서 한 줄씩 입력받아야 할 때 성능이 크게 차이납니다.
- 실제로 백준 상위 랭커들이 거의 다 사용하는 방식이기도 해요.
BufferedWriter는 왜 잘 안 쓰일까?
BufferedWriter
도 빠르지만 숫자를 출력하려면 문자열로 변환해야 하는 번거로움이 있어요.- 예를 들어
int
를 출력하려면String.valueOf(int)
같은 과정을 거쳐야 하죠. - 그래서 간단한 출력에서는
System.out.print()
가 오히려 편하고 충분히 빠릅니다.
그럼 close()는 꼭 써야 할까?
- 자바는 자동으로 메모리를 정리해주는 Garbage Collector(GC)가 있어서,
Scanner
나BufferedReader
를close()
하지 않아도 당장은 문제없어 보일 수 있습니다. - 하지만 GC가 실행되기 전까지 리소스는 그대로 유지되기 때문에,
메모리 누수나 리소스 점유가 길어질 수 있어요.
그래서 정리하자면:
BufferedReader
,BufferedWriter
,Scanner
는 사용이 끝났으면close()
로 명시적으로 닫는 것이 가장 좋습니다.- 특히 Scanner는 System.in을 닫게 되면 다시 입력을 받을 수 없기 때문에,
여러 번 입력을 받아야 하는 프로그램이라면 close() 호출에 주의해야 해요.
실전 팁
상황 | close() 처리 권장 여부 | 비고 |
---|---|---|
한 번만 입력 받고 종료되는 코드 | 해도 되고 안 해도 됨 | 단순 문제 풀이용이면 생략 가능 |
반복적으로 실행되는 프로그램 | 반드시 해주는 게 좋음 | 메모리 누수 및 리소스 낭비 방지 |
BufferedWriter 사용 시 | 반드시 닫아야 함 | 출력 버퍼가 flush() 안 되면 결과 안 나올 수 있음 |
Scanner(System.in) 여러 번 사용 시 | close() 호출 주의! | 닫으면 System.in 자체가 닫혀서 재사용 불가 |
정리하자면,
- Scanner는 편하지만 느리고, BufferedReader는 빠르지만 약간 복잡합니다.
- 실전에서는 BufferedReader + StringTokenizer 조합이 속도와 안정성 모두에서 우수합니다.
- close()는 리소스를 정리하는 습관을 들이는 게 좋고, 특히 BufferedWriter는 꼭 닫아야 합니다.
```
This post is licensed under CC BY 4.0 by the author.