반응형

 

 

<코드>

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 n = Integer.parseInt(br.readLine());
		
		for (int i = 0; i < n; i++) {
			String string = br.readLine();
			int a = Integer.parseInt(string.split(" ")[0]);
			int b = Integer.parseInt(string.split(" ")[1]);
			bw.write(a+b+"\n");
		}
		bw.flush();
	}
}

 

일반적으로 JAVA에서 입력 방식은 Scanner로 하고 출력 방식은 System.out.println("");로 합니다. 

하지만 입력 데이터를 몇십만 혹은 몇 백만씩 받게 된다면? 시간 초과가 발생할 수 있습니다.

 

그러나 Buffer에 있는 IO클래스인 BufferedReader와 BufferedWriter를 사용하면 빠른 입력 출력이 가능하게 됩니다.

문맥 교환, 디스크 IO, 입출력은 실행시간에 꽤나 큰 영향을 주는 작업이며 n이 100만이라고 가정했을 때 각 줄을 읽을 때마다 프로그램에 전달되고 출력을 하게 되면 오버헤드가 발생하게 될 것입니다. 따라서 버퍼를 사용하여 입력 데이터와 출력 데이터를 버퍼링 하여 한 번에 전달하는 것이 효율적입니다.

예시를 들자면 짐(입력 혹은 출력)을 옮길 때 하나하나씩 옮기는 것이 아닌,
카트(버퍼)를 이용하여 짐을 한 번에 옮기는 것이 훨씬 빠르다는 것입니다.

그러나 BufferedReader를 사용할 경우 단점이

  • 입력 데이터들이 String으로 반환된다.
  • 데이터들을 재가공(데이터를 split 후 형 변환 등등...)
  • IOException의 예외처리가 필요하다.

있으며 main함수 우측에 throws IOException를 통해서 예외처리를 해야 합니다.위의 코드에서는 readLine을 통해 한 줄씩 입력을 받고 공백(" ") 기준으로 split을 통해 데이터를 분할하고 형 변환을 해서 bw.write()로 버퍼에 씁니다(화면에 바로 출력 x).for문을 돌고 나면 bw.flush()로 버퍼에 있는 데이터들을 한 번에 출력하게 됩니다.

 

주요 메서드

메서드  기능
 BufferedReader(Reader rd)  rd에 연결되는 문자입력 버퍼스트림 생성
 BufferedWriter(Writer wt)   wt에 연결되는 문자출력 버퍼스트림 생성​
 int read()  스트림으로부터 한 문자를 읽어서 int 형으로 리턴
 int read(char[] buf)  문자배열 buf의 크기만큼 문자를 읽어들임.  읽어들인 문자 수를 리턴
 int read(char[] buf, int offset, int length)  buf의 offset위치에서부터 length 길이만큼 문자를 스트림으로부터 읽어들임​
 String readLine()  스트림으로부터 한 줄을 읽어 문자열로 리턴​​
 void mark()   현재우치를 마킹, 차 후 reset() 을 이용하여 마킹위치부터 시작함
 void reset()   마킹이 있으면 그 위치에서부터 다시시각, 그렇지 않으면 처음부터 다시시작
 long skip(int n)  n 개의 문자를 건너 뜀
 void close()  스트림 닫음
 void write(int c)  int 형으로 문자 데이터를 출력문자스트림으로 출력
 void write(String s, int offset, int length)  문자열 s를 offset 위치부터 length 길이만큼을 출력스트림으로 출력
 void write(char[] buf, int offset, int length)  문자배열 buf의 offset 위치부터 length 길이만큼을 출력스트림으로 출력​​​
 void newLine()  줄바꿈 문자열 출력
 void flush()   남아있는 데이터를 모두 출력시킴.

 

 

https://www.acmicpc.net/problem/15552

 

15552번: 빠른 A+B

첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

www.acmicpc.net

 

 

<참고>

https://coding-factory.tistory.com/251

 

[Java] BufferedReader, BufferedWriter를 활용한 빠른 입출력

BufferedReader/BufferedWriter는 Buffer에 있는 IO 클래스입니다. 입력된 데이터가 바로 전달되지 않고 중간에 버퍼링이 된 후에 전달되됩니다. 출력도 마찬가지로 버퍼를 거쳐서 간접적으로 출력장치로

coding-factory.tistory.com

 

반응형

+ Recent posts