처음에 java를 배우면서 Scanner와 System.out.println();로 입력과 출력을 배웠다.
그런데 몇몇 알고리즘 문제를 풀 때, Scanner를 사용하면 시간초과가 발생해 문제가 틀리는 경우가 있었다. 아무리 생각해도 코드에 오류가 존재하지 않는다고 생각해서, 정답인 코드를 보니 Scanner가 아닌 BufferedReader를 사용하고 있었다.그리고 출력할 때는 BufferedWriter를 사용하고 있었다.
그렇다면❗
BufferedReader & BufferedWriter와 Scanner & System.out.println()의 차이는 무엇이며 어떤 방식으로 사용하면 될까?
그렇다면 여기에서, 왜 Buffer를 사용하는게 속도를 향상시킬까?
마트를 가서 총 10개의 물건을 사야한다고 하자.
이 경우에 첫번째 물건을 고르고 계산하고 , 두번째 물건을 고르고 계산하는 방식을 10번 반복하면 정말 시간이 많이 걸릴 것이다.
반면에 장바구니에 10개의 물건을 모두 넣고, 한번에 계산하면 훨씬 적은 시간이 걸릴 것이다.
이와 비슷하게 사용자가 요청할 때마다 데이터를 읽거나 출력하는 것보다, 사용자의 요청을 한번에 받고 데이터를 읽거나 출력하는 것이 속도면에서 훨씬 이득인 것이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
// 입력 데이터가 String이기 때문에 다른 자료형을 사용하기 위해선 형변환이 필요
int a = Integer.parseInt(br.readLine());
int[] arr = new int[a];
// StringTokenizer: 문자열을 구분자를 이용해 분리할 때 사용하는 클래스
StringTokenizer st = new StringTokenizer(br.readLine());
for(int i=0; i<a; i++) {
arr[i]=Integer.parseInt(st.nextToken()); // 공백으로 문자를 구분해줌
}
}
}
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String s1 = "Hello World~!";
bw.write(s1+"\n"); // 출력
bw.flush(); // 버퍼에 남은 값 출력과 비우기
bw.close(); // 스트림 닫기
}
}