Post

[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 계열이 더 적합함
  • 속도, 문법 편의성, 입력 조건에 따라 유연하게 선택할 수 있어야 함

추천

  • 자바 초보자: Scanner
  • 실전 테스트: BufferedReader + StringTokenizer
  • 극한의 속도, 단일 문자 입력: System.in.read()

입출력 성능과 close() 처리, 진짜 실전에서는?

코딩 테스트에서 속도는 정답 판별에 직접적인 영향을 줍니다.
특히 입력 데이터가 수천 줄을 넘어가는 경우 Scanner로는 시간 초과가 날 수 있어요.

BufferedReader는 왜 빠를까?

  • BufferedReader는 입력을 한 글자씩 읽지 않고, 버퍼에 모아 한 번에 처리합니다.
  • 그래서 반복문 안에서 한 줄씩 입력받아야 할 때 성능이 크게 차이납니다.
  • 실제로 백준 상위 랭커들이 거의 다 사용하는 방식이기도 해요.

BufferedWriter는 왜 잘 안 쓰일까?

  • BufferedWriter도 빠르지만 숫자를 출력하려면 문자열로 변환해야 하는 번거로움이 있어요.
  • 예를 들어 int를 출력하려면 String.valueOf(int) 같은 과정을 거쳐야 하죠.
  • 그래서 간단한 출력에서는 System.out.print()가 오히려 편하고 충분히 빠릅니다.

그럼 close()는 꼭 써야 할까?

  • 자바는 자동으로 메모리를 정리해주는 Garbage Collector(GC)가 있어서, ScannerBufferedReaderclose() 하지 않아도 당장은 문제없어 보일 수 있습니다.
  • 하지만 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.