프로그래밍/java

[백준] 10950번 문제 - A+B-3 - JAVA(자바) & BufferedReader공부

MG_세대 2023. 6. 25. 20:41

문제

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


입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있으며, 각 줄에 A와 B가 주어진다. (0 < A, B < 10)


출력

각 테스트 케이스마다 A+B를 출력한다.

저번 10951번 문제와 유사한 문제로 테스트 케이스를 추가로 입력해줘야한다는것만 달라졌다.

이번엔 두가지 방법으로 코드를짜보았고

2번째 방법은 연습하고있는 중이라 예시를 보면서 코드를 작성 하였다.

 

 

1. Scanner 이용하기!

import java.util.Scanner;

public class b10950_2 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int[] B = new int[sc.nextInt()];

		for (int i = 0; i < B.length; i++) {
			int a = sc.nextInt();
			int b = sc.nextInt();
			B[i] = a + b;
		}

		for (int j : B) {
			System.out.println(j);
		}

	}

}

위와 같이 쉽게 작성할 수 있었다.

 

2. BufferedReader 이용하기!

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st;
		int T = Integer.parseInt(br.readLine());
		for (int i = 0; i < T; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			bw.write((Integer.parseInt(st.nextToken()) + Integer.parseInt(st.nextToken())) + "\n");
		}
		bw.close();
	}

}

출력하는 것도 Buffered를 이용하셔가지고 나도 같이 따라 해보았다.

 

새로운 입력 및 출력값 받기 공부를 해봤다.

 

BufferedReader <  -  > Scanner와 유사하다.

BufferedWriter <  -  > System.out.print(); 와 유사하다.

버퍼쪽이 속도 측면에서 훨씬 빠르다

(입력된 데이터가 바로 전달되지 않고 버퍼를 거쳐 전달되므로 데이터 처리 효율성을 높인다고 한다.)

그래서 많은 양의 데이터를 처리할 대 유리하다고 한다.

 

하지만 그에 비해 BufferedReader는 Enter만 경계로 인식하고 받은 데이터는 String으로 고정되기 때문에 입력 받은 데이터를 가공하는 작업이 필요한 경우가 많다.

 

그래서 import 해야하는 내용들이 좀 추가적으로 있다.

 

import java.io.BufferedReader; // scanner
import java.io.BufferedWriter; // System.out.prtin();
import java.io.InputStreamReader; // java.io 패키지의 바이트 단위 입력을 위한 최상위 입력 스트림 클래스이다.
import java.io.OutputStreamWriter;

 

InputStreamReader / OutputStreamWriter는 바이트 스트림에서 문자 스트림으로, 또는 문자 스트림에서 바이트 스트림으로의 변환을 제공하는 입출력 스트림이다. 바이트를 읽어서 지정된 문자 인코딩에 따라 문자로 변환하는데 사용한다.

 

InputStreamReader/OutputStreamWriter 파고들면 파고들 수록 복잡해진다..

 

*BufferdReader 사용법

BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); //선언
String s = bf.readLine(); //String
int i = Integer.parseInt(bf.readLine()); //Int

선언은 위에있는 예제처럼 진행하면 된다.

입력은 readLine();이라는 메서드를 사용하는데, 여기서 반드시 주의해야할 점 2가지가 있다.

 

첫째,

readLine()시 리턴값을 String으로 고정되기에 String이 아닌 다른타입으로 입력을 받을려면 형변환을 꼭 해주어야한다는 점이다.

 

둘째,

예외처리를 꼭 해주어야한다는 점이다. readLine을 할때마다 try & catch를 활용하여 예외처리를 해주어도 되지만 대개 throws IOException을 통하여 작업한다.

ex) public static void main(String[] args) throws IOException {

**import java.io.IOException; 잊지말고 해주기

 

StringTokenizer st = new StringTokenizer(s); //StringTokenizer인자값에 입력 문자열 넣음
int a = Integer.parseInt(st.nextToken()); //첫번째 호출
int b = Integer.parseInt(st.nextToken()); //두번째 호출

String array[] = s.split(" "); //공백마다 데이터 끊어서 배열에 넣음

Read한 데이터는 Line단위로만 나눠지기에 공백단위로 데이터를 가공하려면 따로 작업을 해주어야하는데, 위의 두가지 방법이 대표적이다.

첫번째 방법으로는 StringTokenizer에 nextToken()함수를 쓰면 readLine()을 통해 입력받은 값을 공백단위로 구분하여 순서대로 호출할 수 있다.

두번째 방법으로는 String.split()함수를 활용하여 배열에 공백단위로 끊어서 데이터를 넣고 사용하는 방식이다..

*BufferedWriter

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));   //할당된 버퍼에 값 넣어주기
String s = "abcdefg";   //출력할 문자열
bw.write(s+"\n");   //버퍼에 있는 값 전부 출력
bw.flush();   //남아있는 데이터를 모두 출력시킴
bw.close();   //스트림을 닫음

BufferedWriter 의 경우 버퍼를 잡아 놓았기 때문에 반드시 flush() / close() 를 반드시 호출해 주어 뒤처리를 해주어야 한다.

그리고 bw.write에는 System.out.println();과 같이 자동개행기능이 없기때문에 개행을 해주어야할 경우에는 \n를 통해 따로 처리해주어야 한다.

 

Buffered에대해 좀 더 공부해봐야할 것같다.