<코드>
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
<참고>
https://coding-factory.tistory.com/251
'🧩PS > 🥈Nomal' 카테고리의 다른 글
[JAVA] 백준 1011번 - Fly me to the Alpha Centauri (0) | 2021.10.04 |
---|---|
[JAVA] 백준 9012번 - 괄호 (0) | 2021.09.17 |
[C/C++] 백준 18870번 - 좌표 압축 (0) | 2021.07.24 |
[C/C++] 백준 2581번 - 소수 (에라토스테네스의 체) (0) | 2021.06.07 |
[C/C++] 백준 19598번 - 최소 회의실 개수 (0) | 2021.04.10 |