반응형
  • 지금까지는 화면 입출력에 Scanner와 System.out 를 사용함
  • 간단한 프로그램을 작성할 때는 문제없지만 시간 제한이 있거나 시간을 줄이기 위해서는
    • Scanner 대신 BurfferedReader 을 통한 입력
    • System.out 대신 BufferedWriter 을 통한 출력
    • StringBuilder 을 통한 String Build 후 System.out 을 통한 출력
    • 등을 사용하면 시간을 줄일 수 있음

예제

  • 숫자 5개와 문자열 5개를 입력받고 모두 더해서 출력하는 예제가 있다고 가정
  • 아래의 예제로 갈수록 속도가 더 빠름

Scanner & System.out 사용 예제

import java.util.Scanner;

public class Test {

    public static void main(String[] args) {

        Scanner sc = new Scanner(System.in);

        int n, sum = 0;
        String str, ans = "";
        for(int i = 0 ; i < 5 ; i ++) {
            n = sc.nextInt();
            sum += n;
        }

        for(int i = 0 ; i < 5 ; i ++) {
            str = sc.next();
            ans = ans.concat(str);
        }

        System.out.println(sum);
        System.out.println(ans);
    }
}

BufferdReader & BufferedWriter 사용 예제

import java.io.*;
import java.util.StringTokenizer;

public class Test {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n, sum = 0;
        String str, ans = "";
        for(int i = 0 ; i < 5 ; i ++) {
            n = Integer.parseInt(st.nextToken());
            sum += n;
        }

        st = new StringTokenizer(br.readLine());
        for(int i = 0 ; i < 5 ; i ++) {
            str = st.nextToken();
            ans = ans.concat(str);
        }

        bw.write(String.valueOf(sum));
        bw.newLine();
        bw.write(ans);
        bw.flush();
        bw.close();
    }
}

BufferedReader & StringBuilder 사용

import java.io.*;
import java.util.StringTokenizer;

public class Test {

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n, sum = 0;
        String str, ans = "";
        for(int i = 0 ; i < 5 ; i ++) {
            n = Integer.parseInt(st.nextToken());
            sum += n;
        }

        st = new StringTokenizer(br.readLine());
        for(int i = 0 ; i < 5 ; i ++) {
            str = st.nextToken();
            ans = ans.concat(str);
        }

        sb.append(sum).append("\n");
        sb.append(ans).append("\n");
        System.out.print(sb);
    }
}

입력 시간비교 - Scanner VS BufferedReader

  • 숫자 1000개 입력 * 10번 ( 단위 : ns )

  • Scanner => 19288600 19339801 17276300 20082400 19366700 20467600 20140899 18039300 20956599 20855401

    • 평균 : 19,581,360 ns
  • BufferedReader => 4895699 5317100 4883700 5552999 5495300 5235301 4455601 5280900 5648700 6015501

    • 평균 : 5,278,080 ns
  • 차이가 크게 나는것을 확인할 수 잇음

출력 시간비교 - System.out VS BufferedWriter VS StringBuilder

  • 숫자 1000개 출력 * 10번 ( 단위 : ns )

  • System.out => 14278900 14603400 14476599 15037400 16803600 15298800 14787999 13763000 13420000 13964200

    • 평균 : 14,643,390 ns
  • BufferedWriter => 2219700 2440499 2130399 1895800 1884599 2525300 2500900 3079399 2478800 1984099

    • 평균 : 2,313,950 ns
  • StringBuilder => 619600 945899 762501 1083500 800900 792499 685100 734099 875701 897799

    • 평균 : 819,760 ns

결론

  • 시간이 중요한 문제에서는 BufferedReader와 StringBuilder을 사용하는 것이 유리
반응형

↓ 클릭시 이동

복사했습니다!