[Java] BufferedWriter와 System.out.print

2022. 2. 9. 19:35Java/Java

728x90
반응형

코드업을 통해 자바 문법을 공부하는데 시간 초과로 문제를 통과하지 못하였다.

여태 많지 않은 출력을 냈기 때문에 시간에서 큰 차이가 없었지만, for() 문을 세 번 사용해

많은 양의 문장을 출력하여야 했기에 시간이 초과가 났지 않나 싶었다.


 

import java.io.*;

public class codeup1084 {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    String array[] = br.readLine().split(" ");

    int r = Integer.parseInt(array[0]);
    int g = Integer.parseInt(array[1]);
    int b = Integer.parseInt(array[2]);

    int cnt = 0;

    for (int i = 0; i < r; i++) {
      for (int j = 0; j < g; j++) {
        for (int k = 0; k < b; k++) {
          System.out.println(String.format("%d %d %d", i, j, k));
          cnt++;
        }
      }
    }

    System.out.print(cnt);
  }

}

처음에 작성한 코드이다. 이때는 System.out.println()을 사용하였고, 총 수행 시간이 3995ms가 나왔다.

 

이러한 과도한 시간 낭비를 막기 위해서 있는 것이 BufferedWriter이다.

 

1. BufferedWriter

많은 양의 입력물을 출력할 때는 Buffer를 사용하여 출력해주는 것이 시간 활용에도 뛰어나다.

 

물론 BufferedWriter 또한 BufferedReader와 마찬가지로 java.io.*를 임포트 시켜주어야 하고 try-catch 또는 throws IOException으로 예외 처리를 해야 한다.

 

import java.io.*;

public class codeup1084 {
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
    String array[] = br.readLine().split(" ");

    int r = Integer.valueOf(array[0]);
    int g = Integer.valueOf(array[1]);
    int b = Integer.valueOf(array[2]);

    int cnt = 0;

    for (int i = 0; i < r; i++) {
      for (int j = 0; j < g; j++) {
        for (int k = 0; k < b; k++) {
          bw.write(i + " " + j + " " + k + "\n");
          cnt++;
        }
      }
    }

    bw.write(String.valueOf(cnt));
    bw.flush();
  }

}

이번에 System.out.print가 아닌 BufferedWriter로 쓴 코드는 351ms라는 9배도 넘는 시간이 감소하였다.

 

BufferedWriter는 println처럼 개행 문자를 포함하지 않기 때문에 개행 문을 쓰기 위해 \n을 사용해주거나 newLine() 메서드를 사용해야 한다.

 

또한, 이는 버퍼를 사용한 코드이기 때문에 수행이 완료되면 flush()나 close() 메서드를 사용하여 버퍼 사용을 완료하였다는 명령을 써야 한다.

 

728x90
반응형

'Java > Java' 카테고리의 다른 글

자바 자료 구조 : 큐 - Queue  (0) 2022.06.27
자바 자료 구조 : 배열 - Arrays & ArrayList  (0) 2022.06.27
[JAVA] 객체 지향이란?  (0) 2022.04.03
[Java] 입출력 - BufferedReader와 Scanner  (0) 2022.02.07