ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] BufferedReader, BufferedWriter 를 이용한 빠른 입출력
    자료구조 및 알고리즘/문제풀이 2016. 11. 21. 20:56

     알고리즘 공부를 하면서 별 의미를 두지는 않았었으나, 실제로는 입출력 때문에 유의미한 시간의 차이가 나는 경우가 꽤 있었기에, BufferedReader 와 BufferedWriter 를 이용하여 입출력 받는 방식에 대해 간단하게 설명드리고자 합니다.


     Java를 사용할 경우, 입력 시에는 보통 Scanner를 이용하여 많이 입력을 받곤 하는데, 테스트 케이스의 수가 적을 때는 큰 문제가 되지 않지만 그 수가 커질 수록 Scanner로 입력받는 데에 한계를 느낄 수 있습니다.



    Scanner


    Scanner sc = new Scanner( System.in );
    int T = sc.nextInt();
    


     아무래도 쓰기 편하기 때문에 간단하게 짜는 경우는 Scanner를 쓰는 것이 좋아보입니다. 그러나 위에서 말씀드린 대로 Scanner로 입력 받는 데에 한계를 느낄 때 사용하는 것이 BufferedReader 입니다. 사용 방식은 크게 스캐너와 다르다고는 할 수 없고, 선언하는 방식만 아래에 따라오는 방법대로 작성하시면 됩니다.




    BufferedReader


    BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
    int T = Integer.parseInt( br.readLine() );


     보시면 아시겠지만 선언하는 부분에만 유의하시면 되고, 다른 점은 데이터를 readLine() 함수를 이용해서 읽어올 경우 String의 리턴값을 가진다는 점입니다. 그렇기 때문에 여기서는 parseInt() 함수를 이용하여 String 값을 int 형으로 파싱해 주었습니다. 또한 Scanner의 경우 그냥 nextInt를 입력하면 알아서 공백 다음 숫자를 받기 때문에 어려움 없이 사용할 수 있지만, 이 부분에서도 BufferedReader를 사용할 경우에는 조금 다른 방식을 취해야 합니다. StringTokenizer 를 이용하는 방식이 바로 그것입니다. 이름과 같이 String을 특정 구분자(delimeter) 값을 통해 분리하는 함수입니다. 기본적으로는 공백을 기준으로 문제열을 가릅니다. split 함수를 생각하면 조금 쉬우실 것 같습니다.

     사용법은 아래와 같습니다.




    StringTokenizer


    BufferedReader br = new BufferedReader( new InputStreamReader( System.in ) );
    StringTokenizer st = new StringTokenizer( br.readLine() );
    
    int T = Integer.parseInt( st.nextToken() );
    int N = Integer.parseInt( st.nextToken() );


     선언한 StringTokenizer에 nextToken() 함수를 쓰면 br.readLine() 을 통해 입력받은 값을 공백단위로 구분하여 nextToken() 을 통해 순서대로 호출할 수 있습니다. 기본적으로는 공백이 구분자로 사용되지만, StringTokenizer 선언시 2번째 파라미터로 별도로 구분자를 추가할 수도 있습니다.


     이제 마지막으로 BufferedWriter 에 대해서 말씀드리겠습니다. 일반적인 System.out.println() 함수를 많이 사용하곤 하는데, 사실 해당 부분은 테스트 케이스가 작을 때에는 크게 속도차이가 나지는 않는다고 알고 있습니다. 그러나 테스트 케이스가 무척 커지면 이러한 사소한 부분에서도 실행 가능하고 불가능한 여부가 결정되기 때문에 알고리즘 문제를 푸실 때에는 BufferedWriter를 사용하는 편이 좋을 것이라 생각됩니다.




    BufferedWriter


    BufferedWriter bw = new BufferedWriter( new OutputStreamWriter( System.out ) );
    bw.write( "Hello World!!\n" );
    bw.flush();
    bw.close();


     위의 예시 코드를 보시면 역시 BufferedReader 와 유사하게 선언할 수 있음을 알 수 있습니다. 사용법도 크게 어렵지 않습니다. 일반적으로 자바의 System.out.println을 이용할 경우에는 자동으로 줄바꿈을 해주지만, 해당 부분을 와일드카드( \n ) 으로 처리해야 한다는 정도의 차이입니다. 위에서 보시면 알 수 있듯이 write 안에 쓰고자 하는 문자열을 쓰고 사용하시면 됩니다.


     다만 주의하실 점은 마지막에 flush() 함수나 close() 함수를 써 주지 않을 경우 제대로 출력되지 않을 수 있다는 점입니다. 이 점에만 유의하여 사용하시면 될 것 같습니다.


     코드를 제가 그냥 텍스트로 작성한 것이라, 오타가 있거나 할 수 있는데, 혹여 이러한 부분이 있다면 알려주시면 감사드리겠습니다.


    댓글

Designed by Tistory.