ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA] BufferedReader와 BufferedWriter 사용법
    프로그래밍 언어/JAVA 2023. 5. 25. 10:41

     

    https://www.acmicpc.net/problem/15552

     

    15552번: 빠른 A+B

    첫 줄에 테스트케이스의 개수 T가 주어진다. T는 최대 1,000,000이다. 다음 T줄에는 각각 두 정수 A와 B가 주어진다. A와 B는 1 이상, 1,000 이하이다.

    www.acmicpc.net

     

     

    백준 15552번에 보면 아래와 같은 설명이 있다. 앞선 문제를 풀면서 Scanner 대신 BufferedReader를 많은 사람들이 사용하고 있기에 BufferedReader의 개념을 익히고 사용할 수 있었다. 

     

    본격적으로 for문 문제를 풀기 전에 주의해야 할 점이 있다. 입출력 방식이 느리면 여러 줄을 입력받거나 출력할 때 시간초과가 날 수 있다는 점이다. Java를 사용하고 있다면, Scanner와 System.out.println 대신 BufferedReader와 BufferedWriter를 사용할 수 있다. BufferedWriter.flush는 맨 마지막에 한 번만 하면 된다.

     

     

    그러나 출력에 대해선 System.out.println() 을 사용하고 있었다. 출력도 BufferedWriter를 사용하면 더 빠른 시간안에 값을 출력할 수 있다는 걸 알게 되었다. 그럼 그 개념에 대해 알아보자. 

     


     

     

    https://wonisdaily.tistory.com/193

     

    [JAVA] Scanner 와 BufferedReader

    사용자(키보드)에 입력을 받기 위해 Scanner 클래스를 사용한다. 하지만 알고리즘을 풀다보면 시간 초과가 발생하는 경험을 하게 된다. 나는 아직 해보기 전인데, 간단한 문제 풀고 다른 사람의 답

    wonisdaily.tistory.com

     

    이전에 간단하게 정리한 적이 있다. 이번 포스팅에선 더 자세히 적으려고한다.

     

    BufferedReader와 BufferedWriter는 버퍼를 사용하여 읽기와 쓰기를 하는 함수이다. 버퍼를 사용하지 않은 입력은, 키보드의 입력이 키를  누르는 즉시 바로 프로그램에 전달된다. 반면 버퍼를 사용하는 입력은, 키보드의 입력이 있을 때마다 한 문자씩 버퍼로 전송한다. 버퍼가 가득 차거나 혹은 개행 문자가 나타나면 버퍼의 내용을 한 번에 프로그램에 전달한다. 

     

    쓰레기통을 비우는 일이라고 생각하면 이해가 쉽다. 쓰레기가 생길 때마다 하나 하나 내다 버리는 것보다, 집의 쓰레기통에 모았다가 꽉 차면 한 번에 밖에 버리는 게 훨씬 효울적인 것과 비슷한 개념이라 생각할 수 있다. 

     

     

    📑 BufferedReader란? 

     

    Scanner는 띄어쓰기와 개행뭄ㄴ자를 경계로 하여 입력 값을 인식하기에 따로 가공할 필요가 없다. int형 변수를 입력받고자 한다면 int x = scanner.nextInt()를 사용해 원하는 타입의 입력을 받을 수 있다. 

     

    그러나 BufferedReader는 개행문자만 경계로 인식하고 입력받은 데이터는 String으로 고정된다. 그렇기에 따로 데이터를 가공해야하는 경우가 많지만 Scanner보다 속도가 빠르다. 

     

     

     

    📌사용법 

    BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 선언
    String s = br.readLine();
    int i = Integer.parseInt(br.readLine());

     

    입력은 readLine()이라는 메서드를 사용한다. String으로 값이 고정되어 있기 떄문에 다른 타입으로 입력을 받고자 한다면 반드시 형변환이 필요하다. 

     

     

     

    📌 데이터 가공 

     

    BufferedReader를 통해 읽어온 데이터는 개행문자 단위(Line 단위)로 나누어진다. 만약 이를 공백 단위로 데이터를 가공하고자 한다면 따로 작업을 해줘야 한다. 이떄 사용하는 것이 StringTokenizer나 String.split() 함수이다. 

     

    package step3;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.StringTokenizer;
    
    public class Q4_25304 {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            int totalPrice = Integer.parseInt(br.readLine());
            int totalCount = Integer.parseInt(br.readLine());
            int calculPrice=0;
    
            //한줄씩 읽어오는데 띄어쓰기를 기준으로, 앞에는 가격 뒤에는 수량.
            for(int i=0; i<totalCount; i++){
                StringTokenizer tokenizer = new StringTokenizer(br.readLine()," ");//공백으로 값을 읽어와라.
                //★ 지역변수로 할 수 있는 건 지역변수로 하자.
                int itemPrice = Integer.parseInt(tokenizer.nextToken());
                int itemCount = Integer.parseInt(tokenizer.nextToken());
                //  sum += Integer.parseInt(st.nextToken()) * Integer.parseInt(st.nextToken());
                calculPrice += (itemPrice * itemCount);
    
            }
    
            if(calculPrice == totalPrice){
                System.out.println("Yes");
            }else{
                System.out.println("No");
            }
    
    
    
    
        }
    }

     

     

    📑 BufferedWriter란?

     

    일반적으로 출력할 때, System.out.println("");을 사용한다. 적은 양의 출력에서는 편리하고, 그렇게 큰 성능 차이 없이 사용할 수 있다. 하지만 많은 양의 데이터를 출력할 댸는 입력과 동일하게 버퍼를 사용하는 것이 좋다. 

     

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
    String s = "abcdef"; // 출력할 문자열
    bw.write(s); // 출력
    bw.newLine(); // 줄바꿈
    bw.flush(); // 남아있는 데이터 모두 출력
    bw.close();

     

    BufferedWriter는 System.out.println("") 처럼 출력과 개행을 동시에 해주지 않기 때문에 개행을 위해선 따로 newLine() 또는 bw.write("\n")을 해줘야한다. 그리고 BufferedWriter의 경우 버퍼를 잡아 놓았기 때문에 반드시 사용후에 flush()/ close()를 해줘야한다. 

     

     

    package step3;
    
    import java.io.*;
    
    public class Q5_25314 {
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    
    
            int N = (Integer.parseInt(br.readLine()))/4;
    
            StringBuilder sb = new StringBuilder();
            for(int i=0; i<N; i++){
                sb.append("long").append(" ");
            }
           /* sb.append("int");
            System.out.println(sb);*/
            sb.append("int");
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); // 선언
            //bw.write()는 파라미터로 StringBuilder를 받을 수 없다. 
            bw.write(sb.toString());
            bw.close();
    
    
        }
    }

     

    반응형

    댓글

Designed by Tistory.