더 좋은 문제 풀이가 있거나 궁금하신 점이 있다면 편하게 댓글 남겨주세요!
이번 문제는 기존 문제와는 달리 시간 제한이 조건으로 주어졌습니다. 그래서 기존에 입출력 방식으로 사용했던 Scanner, System.out.println()
은 사용할 수 없고 BufferedReader, Bufferedwriter
를 사용해야 합니다.
그럼 먼저 두 방식이 어떻게 다른지 개념을 익히고 코드를 통해 살펴보겠습니다.
대부분의 경우 데이터 입력 시 Scanner를 사용하는데요. Scanner의 경우, regular expression 정규표현식을 많이 사용함으로 사용자가 직접 파싱하는게 더욱 빠릅니다. 이의 대안이 될 수 있는 방법이 바로 BufferedReader 입니다.
버퍼를 사용하지 않는다면 키보드를 통해 입력하는 즉시 바로 프로그램에 전달됩니다.
그러나 BufferedReader의 경우 키보드에 입력이 있을 때마다 문자를 버퍼에 저장하고, 버퍼가 가득차거나 개행문자가 나타나면 버퍼의 내용을 한 번에 전송하기에 더욱 빠른 속도를 낼 수 있습니다.
또한, BufferedReader는 Enter만을 개행문자로 인식하고, 데이터 타입이 String 로 일정합니다. 하여 int 형으로 사용할려면 형변환이 필요합니다.
BufferedReader, Bufferedwriter 사용법
//BufferedReader를 이용한 데이터 입력
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); //BufferedReader 선언
String str = br.readLine(); // String
int num = Integer.parseInt(br.readLine()); // Int 형변환
//방법1
StringTokenizer st = new StringTokenizer(str); // StringTokenizer에 입력 문자열 넣음
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
//방법2
String array[] = str.split(" "); // 공백마다 데이터 구분해서 배열에 넣음
}
}
방법1은 StringTokenizer에 nextToken()함수를 쓰면 readLine()을 통해 입력받은 값을 공백단위로 구분하여 순서대로 호출할 수 있습니다.
방법2는 String.split()함수를 활용하여 배열에 공백단위로 끊어서 데이터를 넣고 사용하는 방식입니다.
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 cnt = Integer.parseInt(br.readLine());
for(int i =0; i < cnt; i++){
String str = br.readLine();
int num1 = Integer.parseInt(str.split(" ")[0]);
int num2 = Integer.parseInt(str.split(" ")[1]);
bw.write(num1 + num2 + "\n");
}
br.close();
bw.flush();
bw.close();
}
}