[단계별로 풀어보기-Java] 1단계 입출력과 사칙연산 (1) - BufferedReader, System.in 활용하기
✏️ 문제 번호 : 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);
}
}
메모리와 시간을 비교하면 확연한 성능 차이를 확인할 수 있다.
✏️ 문제 번호 : 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());
}
}