알고리즘/백준

[단계별로 풀어보기-Java] 1단계 입출력과 사칙연산 (1) - BufferedReader, System.in 활용하기

꾸주니=^= 2025. 1. 14. 17:31

백준 사이트 로고


✏️ 문제 번호 : 2557

Hello World!를 출력하시오.

public class Main {
    public static void main(String[] args) {
        System.out.print("Hello World!");
    }
}

 


✏️ 문제 번호 : 1000

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)


출력
첫째 줄에 A+B를 출력한다.

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);
    }
}

 


✏️ 문제 번호 : 1001

두 정수 A와 B를 입력받은 다음, A-B를 출력하는 프로그램을 작성하시오.

입력
첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)

출력
첫째 줄에 A-B를 출력한다.

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);
    }
}

 


 

1000,1001을 풀면서 드는 의문이 생겼다

scanner을 사용 안하는 방법은 뭐가 있을까!?
짧코딩을 하고 싶다 !!


그래서 gpt 선생님께 물어봤다.

BufferedReader 또는 System.in을 사용하면 더 짧고 간결하게 코드를 입력 받는 방법이 있다고 한다 !!

 


1. BufferedReader 사용하는 방법

BufferedReader Scanner보다 빠르고, 간결하게 입력을 처리할 수 있습니다.
하지만 입력받은 데이터를 문자열로 처리하기 때문에 숫자로 변환해야 하는 과정이 필요합니다.

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception {
    	// BufferedReader 객체 생성
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        
        // 입력받은 문자열 한 줄 읽기
        String[] input = br.readLine().split(" ");
        // "3 5"처럼 공백으로 구분된 숫자들을 읽어와 split으로 나눔
        
        // 각각 정수로 변환
        int a = Integer.parseInt(input[0]);
        int b = Integer.parseInt(input[1]);
        
        System.out.println(a + b);
    }
}

주요 포인트

(1) BufferedReader와 InputStreamReader

BufferedReader는 입력을 버퍼에 저장해 빠르게 읽는 클래스입니다.
InputStreamReader는 바이트 스트림을 문자 스트림으로 변환하는 클래스입니다.

(2) readLine()

입력받은 전체 문자열을 한 줄로 읽습니다.
예: "3 5"를 읽어 문자열로 반환합니다.

(3) split(" ")

공백 기준으로 문자열을 나눕니다.
결과: ["3", "5"]처럼 문자열 배열이 됩니다.

(4) Integer.parseInt()

문자열을 정수로 변환합니다.

 

 

2. 단축형 코딩 방법 ( One-liner로 작성 )

System.in.read()는 입력을 하나씩 바이트 단위로 읽습니다.
이를 활용하면 아주 간단한 형태의 프로그램을 만들 수 있습니다. 하지만 복잡한 입력 처리는 어렵습니다.

 

방법 1

public class Main {
    public static void main(String[] args) throws Exception {
        // 첫 번째 숫자를 읽고 문자 '0'의 아스키 값(48)을 빼서 정수로 변환
        int a = System.in.read() - '0';
        
        // 중간의 공백 문자(32)를 처리
        System.in.read();
        
        // 두 번째 숫자를 읽고 문자 '0'의 아스키 값(48)을 빼서 정수로 변환
        int b = System.in.read() - '0';
        
        System.out.println(a + b);
    }
}

 

방법 2

public class Main {
    public static void main(String[] args) throws Exception {
        System.out.print((System.in.read() - '0') + (System.in.read() - '0' - System.in.read() + ' '));
    }
}

주요 포인트

(1) System.in.read()

입력을 한 글자씩 읽습니다.
예 : 입력 3 5 를 순차적으로 읽습니다.
3 -> 공백 -> 5

(2) 공백 문자 처리

숫자 사이의 공백(아스키코드: 32)을 System.in.read()로 읽고 무시합니다.

 


두 방법의 차이점

항목 BufferedReader System.in.read()
사용성 여러 줄 입력, 긴 입력 처리에 적합 단순한 입력 처리에 적합
속도 빠름 매우 빠름
코드 복잡도 비교적 명확한 코드 코드가 짧지만, 가독성은 떨어짐
유연성 문자열 처리, 다양한 데이터 타입 변환 가능 문자 입력만 가능

 


곱셈 문제는 System.in.read()을 사용해 풀어보았다.

 

✏️ 문제 번호 : 10998

두 정수 A와 B를 입력받은 다음, A*B를 출력하는 프로그램을 작성하시오.

입력 : 첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력 : 첫째 줄에 A*B를 출력한다.

public class Main {
    public static void main(String[] args) throws Exception {
        int a = System.in.read() - '0';
        System.in.read();
        int b = System.in.read() - '0';
        System.out.println(a * b);
    }
}

 

메모리와 시간을 비교하면 확연한 성능 차이를 확인할 수 있다.

scanner 사용할 시
System.ind.read() 사용할 시

 


✏️ 문제 번호 : 1008

두 정수 A와 B를 입력받은 다음, A/B를 출력하는 프로그램을 작성하시오.

입력 : 첫째 줄에 A와 B가 주어진다. (0 < A, B < 10)
출력 : 첫째 줄에 A/B를 출력한다. 실제 정답과 출력값의 절대오차 또는 상대오차가 10-9 이하이면 정답이다.

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.printf("%.9f", sc.nextDouble() / sc.nextDouble());
    }
}