티스토리 뷰

 

 

codeUp에 '3가지 빛 섞어 색 만들기' 문제를 Scanner 입력 함수를 이용하여 풀었는데 시간 초과 라는 결과가 나왔다. 

문제를 넘어가기 위해서는 다른 풀이방법을 써야 하기에

이 글에서 BufferedReader와 BufferedWriter 클래스를 사용한 내용을 정리할 것이다.

 

 

 

import java.util.Scanner;

public static void main(String[] args) {

        /**
         * 시간초과된 코드
         */
        Scanner sc = new Scanner(System.in);
        int red = sc.nextInt();
        int green = sc.nextInt();
        int blue = sc.nextInt();
        int count1 = 0; // 마지막 개수를 출력할 변수

        for (int i = 0; i < red ; i++) {
            for (int j = 0; j < green; j++) {
                for (int k = 0; k < blue; k++) {
                    System.out.printf("%d %d %d \n", i, j, k);
                    count1 += 1; // 가짓수를 찾을 때마다 1씩 증가
                }
            }
        }
        System.out.println(count1);
}

 

 

 

시간초과가 되었다고 다른 설계 방법을 제시해준다.

 

 

 BufferedReader와 BufferedWriter 클래스를 사용하여 리팩토링

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

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[] color = br.readLine().split(" ");
        int count2 = 0;

        for(int i = 0; i < Integer.valueOf(color[0]); i++) {
            for (int j = 0; j < Integer.valueOf(color[1]); j++) {
                for (int k = 0; k < Integer.valueOf(color[2]); k++) {
                    bw.write(i + " " + j + " " + k + "\n");
                    count2 += 1;
                }
            }
        }
        bw.write(String.valueOf(count2));
        bw.flush();
}

 

 

 

Scanner와 println()을 사용했을 때 시간초과 / Buffered 클래스를 사용했을 때 통과

 

 


 

자바에서 빠른 입출력을 하려면?

Scanner 보다 더 빠른 입력을 하기 위해선 아래와 같이 BufferedReader를 사용한다.

 

 

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

 

 

BufferedReader는 java.io 패키지에 있으므로 사용하기 위해서는 import를 해주어야 한다.
또한 readLine() 이라는 메서드를 제공하여 Scanner의 nextLine() 처럼 한줄 단위로 읽어 올수 있는데 리턴값이 String 이기 때문에 내가 원하는 변수타입으로 직접 변경을 시켜줘야 한다.

 

 


 

 

출력도 비슷한 이름의 객체를 사용한다. 바로 BufferedWriter 이다.

 

 

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); 
bw.write("example\n");

 

 

출력은 위 코드에서 보다싶이 write() 메서드를 사용한다.

주의할 점은 System.out의 println() 과 달리 개행문자를 따로 쳐주어야 한다. 자동으로 처리를 안해준다는 뜻이다.

 

 

 

 

BufferedReader와 BufferedWriter 란?

BufferedReader / BufferedWriter 는 이름에서 알 수 있듯이 버퍼(Buffer)를 가지는 입출력스트림이다.
버퍼란 데이터를 일시적으로 저장하기 위한 공간을 의미한다.
자바에서 입출력스트림들은 운영체제API를 호출하여 입출력장치와 응용프로그램 사이에서 데이터가 전송되도록 하는데 버퍼가 없이 많은 양의 데이터를 입출력 할시에는 그만큼 자주 운영체제 API가 호출되고 또한 그만큼 실행속도가 떨어질 것이다. 어느정도 모아뒀다가 한번에 처리를 하는것이 많은 양을 처리할 땐 더 빠르다는 것이다.
비유를 들자면 물 10리터를 우물에서 퍼와야 하는데 조그만한 머그컵을 들고 수십번 왔다갔다 하는것보단 커다란 약수통 하나 들고가서 몇번 나르는게 더 효율적인 느낌이다.

BufferedWriter을 사용할 때 주의할 점으로는 flush() 메서드를 사용해주어야 한다는 것이다.
버퍼스트림은 버퍼가 꽉 찼을 때만 출력되는 특징이 있다고 한다. 그러면 프로그램에서 데이터를 출력했지만 버퍼에 들어있어 내 모니터엔 안보일 수 있다는 것이다.

그리고 BufferedReader와 BufferedWriter 모두 IOException을 발생시킬 수 있으므로 try-catch문을 사용하던, throws를 하던 예외처리를 해주어야 한다.

 

 

 

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함