그냥 문제만 보면 초보자도 매우 쉽게 풀 수 있을 듯하다.
테스트 케이스와 덧셈 연산에 쓰일 두 숫자를 반복해서 입력받고 결과 값을 출력하면 되는 문제이다.
다만, 이 문제에는 시간 제한이 걸려있다.
그래서 입출력시 일반적으로 사용하던 Scanner
와 System.out.println();
는 사용하지 못한다.
이를 이용해서 입출력을 처리하면 시간 제한을 죽어도 맞출 수가 없다.
우리는 이제 입출력에 있어서 더 효율적인 것을 사용할 차례이다.
BufferReader
는 기존의 Scanner
와 유사하다.
BufferReader
와 BufferWritter는 스트림이라는 것을 이용하는데, 이것이 입출력에서의 효율을 끌어올린다.
(스트림의 자세한 원리는 나중에 다룬다...)
우선 BufferReader
와 입력 스트림 리더(InputStreamReader
)를 import
로 불러와야한다.
스트림을 사용할 때에는 반드시 입출력에 대한 예외처리를 해주어야한다.
사용할 때마다 try-catch
를 사용하는 방법도 있지만, 간단하게 throws
를 이용하는 방식이 널리 쓰인다. 예외처리를 위해서 이 역시 import
를 필요로 한다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
이 녀석은 입력값을 받을 때 반드시 문자열로만 읽어들이기 때문에 받은 값을 다른 자료형으로 사용하고 싶다면 반드시 형 변환을 해줘야 한다.
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(bf.readLine());
문자열을 받았을 때, Enter
를 기준으로 나누기 때문에 공백문자를 포함한다.
그렇기 때문에 숫자를 여러 개 받는다든지 할 때에는 StringTokenizer
로 나누거나 String.split()
으로 문자열을 분리해서 처리해야한다.
String s = bf.readLine();
StringTokenizer st = new StringTokenizer(s);
int num1 = Integer.parseInt(st.nextToken());
int num2 = Integer.parseInt(st.nextToken());
BufferWriter
는 System.out
과 유사하다.
마찬가지로 import
를 통해 사용하며 BufferWriter.write()
로 출력한다.
이 친구는 버퍼를 잡아놓기 때문에 BufferWriter.flush()
를 통해 남은 데이터를 전부 출력시킨 뒤 close()
로 닫는 뒷정리가 필요하다.
❗ 사실 Scanner도 close()로 닫는게 맞다. 습관이 안된 것일 뿐이지.
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
bw.write(num1 + num2 + "\n");
bw.flush();
bw.close();
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 bf = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(bf.readLine());
for(int i = 0; i < n; i++) {
String s = bf.readLine();
StringTokenizer st = new StringTokenizer(s);
int num1 = Integer.parseInt(st.nextToken());
int num2 = Integer.parseInt(st.nextToken());
bw.write(num1 + num2 + "\n");
}
bw.flush();
bw.close();
}
}
아무쪼록 새로운 입출력 방식에 익숙해져야 시간 제한의 덫을 벗어날 수 있을테니 익숙해질 필요가 있어보인다.