백준 문제를 풀다가
다른 사람들의 코드를 보니
BufferedReader를 통해서 입력값을 받고 있었다.
나는 계속 Scanner를 사용해왔기 때문에
이 둘의 차이를 알기 위해 찾아보다가
Scanner의 입력 속도가 BufferedReader보다 느리다는 것을 알게 되었다.
위 표는 백준에 올라온 입력 속도 비교라는 게시글에 있는 표이다.
출처는
https://www.acmicpc.net/blog/view/56
여기이다.
방법을 알아보자
✔️Scanner의 경우
import java.util.* ;
public class Main{
public static void main(String[] args){
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
System.out.println(n);
}
}
✔️BufferReader의 경우
import java.io.* ;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br =
new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(br.readLine());
System.out.println(n);
br.close()
}
}
Scanner처럼 자체적으로 Exception에 대한 처리가 되어 있지 않아서, throws Exception 혹은 try ~ catch 를 이용해서 Exception을 따로 처리
BufferedReader은 문자열 String값 밖에 읽지 못한다.
마지막에 close()를 선언해야 한다.
일반적으로 라인단위로 입력을 받게 되며, 라인 바이 라인으로 입력값의 경계를 인식하기 때문에 한줄에 공란을 경계로 여러 값이 입력된 경우라면 파싱이 필수적
만약에 "30 42 70 35 90" 이렇게 입력받게 된다면
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");//import java.util.StringTokenizer;
int value[] = new int[5];
for(int i=0;i<5;i++){
value[i] = Integer.parseInt(st.nextToken());
}
한가지 예시 더 추가
위 입력의 경우
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine()," ");
int police=0;
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[] row = new int[n];
int[] col = new int[m];
for(int i=0;i<n;i++){
String in = br.readLine();
for(int j=0;j<m;j++){
if(in.charAt(j)=='X'){
row[i]=1;
col[j]=1;
}
}
}
또한 한가지 더
System.out.println은 출력 속도가 BufferedWriter보다 현저히 느리다는 것도 알게 되었다.
무려 System.out.println은 43위이다.
이 표는 출력 속도를 비교하는 표이며 백준 게시글에 올라와 있다.
출처는
https://www.acmicpc.net/blog/view/57
여기이다.
✔️ BufferedWriter의 경우
BufferedWriter bw = new BufferedWriter(new OutputStream(System.out));
bw.write(a);
bw.flush();
bw.close();