1. 문제
본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다.
Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.
또한 입력과 출력 스트림은 별개이므로, 테스트케이스를 전부 입력받아서 저장한 뒤 전부 출력할 필요는 없다. 테스트케이스를 하나 받은 뒤 하나 출력해도 된다.
<입력>
첫 줄에 테스트케이스의 개수 T를 입력한다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B를 입력한다. A와 B는 1 이상, 1,000 이하이다.
<출력>
각 테스트케이스마다 A+B를 한 줄에 하나씩 순서대로 출력한다.
2. 코드
import java.io.*;
public class Main{
public static void main(String[] args)throws Exception{
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 input = bf.readLine();
String[] tmp = input.split(" ");
int a = Integer.parseInt(tmp[0]);
int b = Integer.parseInt(tmp[1]);
bw.write(a+b+"\n");
}
bw.flush();
bw.close();
}
}
3. 풀이
Java는 BufferedReader/BufferedWriter를 이용한다.
BufferedReader와 BufferedWriter는 io 클래스에 있으므로 import java.io.*;를 해준다.
입력된 데이터가 바로 전달되지 않고 중간에 버퍼링이 된 후에 전달되는데, 출력도 마찬가지로 버퍼를 거쳐서 간접적으로 출력장치에 전달된다. 따라서 시스템의 데이터 처리 효율성을 높여주며, InputStreamReader와 OutputStreamWriter를 같이 사용하여 버퍼링을 하게되면 입출력 스트림으로부터 미리 버퍼에 데이터를 갖다 놓기 때문에 효율적인 입출력이 가능하다.
Scanner의 경우, space와 enter를 경계로 인식하기 때문에 입력받은 데이터를 가공하기 편리하지만, BufferedReader는 enter만 경계로 인식하고 받은 데이터가 String으로 고정되기 때문에 입력받은 데이터를 가공하는 작업이 필요해 불편하다. (많은 양의 입력을 받을 경우, 효율적이기 때문에 BufferedReader를 사용한다. )
<*ERROR*>
unreported exception IOException; must be caught or declared to be thrown
try문 내에서 BufferedReader를 사용하거나 메소드 끝에 throws Exception 구문을 붙여줘야 한다.
BufferedReader와 BufferedWriter사용방법
BufferedReader와 BufferedWriter를 선언
BufferedReader 이름 = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String의 경우
String 변수 = BufferedReader이름.readLine();
int의 경우
int 변수 = Integer.parseInt(BufferedReader이름.readLine());
BufferedWriter사용하여 출력
BufferedWriter이름.write( );
BufferedWriter의 경우 버퍼를 잡아놓았기 때문에 반드시 flush()와 close()를 해주어야 한다.
flush()는 남아있는 데이터를 모두 출력시키는 것이고, close는 스트림을 닫는것 이다.
4. 링크
https://www.acmicpc.net/problem/15552
'Computer Science > 자료구조와 알고리즘' 카테고리의 다른 글
[JAVA] 백준 2742번 기찍 N (0) | 2020.07.12 |
---|---|
[JAVA] 백준 2741번 N 찍기 (0) | 2020.07.12 |
[JAVA] 백준 8393번 합 (0) | 2020.07.04 |
[JAVA] 백준 10950번 A+B-3 (0) | 2020.07.04 |
[JAVA] 백준 2739번 구구단 (0) | 2020.07.04 |