이제부터 Scanner가 아닌 BufferedReader를 사용해야 하는 이유

byeol·2023년 1월 7일
0

백준 문제를 풀다가
다른 사람들의 코드를 보니
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);
  
  }


}
  • Scanner는 공란과 줄바꿈 모두 입력값의 경계로 인식하기 때문에 데이터를 입력받기에 용이

✔️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();
  • nextLine()은 줄바꿈
profile
꾸준하게 Ready, Set, Go!

0개의 댓글