BufferedReader
와 BufferedWriter
:문제 풀기 앞서,
BufferedReader
와 BufferedWriter
에 대해 몇가지 알고 가자.
Scanner
/System.out.println
대신하여 BufferedReader
/BufferedWriter
를 사용하는 이유는 몇 십만, 몇 백만건 대량의 데이터를 보다 빠르게 처리하기 위해서이다.
입출력 작업(IO)과 문맥 교환(Context Switching)은 생각보다 느린 작업이므로, 키보드 입력이 발생할 때마다 프로그램에 전달하는 것보다, 입력을 한 번에 모아 전달하는 방식이 더 효율적이다.
이는 마트에서 물건을 살 때, 하나씩 계산대에 가져가 결제하는 것보다 쇼핑카트에 모아두었다가 한 번에 계산하는 것이 더 빠른 것과 같은 원리다.
그러나 BufferedReader
에도 몇 가지 단점이 있다.
IOException
예외 처리가 필수적이다.String
으로 반환된다.split(" ")
을 사용해 처리해야 한다.Integer.parseInt()
등의 형변환 과정이 필요하다.예를 들어, 입력 데이터로 1 2 3
이 들어왔다고 가정하자.
Scanner
의 nextInt()
를 사용하면 [1, 2, 3]
을 개별 숫자로 바로 받을 수 있다.
반면, BufferedReader
의 readLine()
을 사용하면 "1 2 3"
이라는 문자열로 받아지므로, 이를 split(" ")
로 나눈 뒤 Integer.parseInt()
를 통해 숫자로 변환해야 한다.
링크: https://www.acmicpc.net/problem/15552
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.IOException; // BufferedReader를 사용함으로써 예외처리 필수
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));
int T = Integer.parseInt(br.readLine()); // String으로 리턴값 고정, Integer.parseInt 통해 형변환 필요
StringTokenizer st;
for(int i=1; i<= T; i++){
st = new StringTokenizer(br.readLine(), " "); // 공백 단위를 기준으로 데이터 가공하기 위함
int A = Integer.parseInt(st.nextToken()); //첫번째 호출,
int B = Integer.parseInt(st.nextToken()); //두번째 호출
bw.write((A+B)+"\n"); // 버퍼에 씀
}
//br.close(); // close() 메소드를 명시해주지 않아도 Garbage Collector에 의해 BufferedReader 및 내부의 객체들이 자동으로 정리됨
bw.flush(); // 화면에 출력, 필요할 때 한 번만 수행해주면 됨
//bw.close(); // 자원 관리의 중요성으로 인해 해주면 좋음
}
}
아래와 같은 방법으로도 풀 수 있다.
import java.io.*;
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));
int T = Integer.parseInt(br.readLine());
for(int i=1; i<= T; i++){
String s = br.readLine();
int A = Integer.parseInt(s.split(" ")[0]); //첫번째 호출
int B = Integer.parseInt(s.split(" ")[1]); //두번째 호출
bw.write((A+B)+"\n"); // 버퍼에 씀
}
bw.flush(); // 화면에 출력
}
}