[Java] 입력 - Scanner 대신 Buffer / StringTokenizer (백준 1000번)

Jina·2023년 7월 12일
0

Java

목록 보기
1/13
post-thumbnail

지금까지는 java에서 입력을 받기 위해 Scanner를 사용해왔는데, 백준에서 입출력 기본문제들을 풀다보니 다른 사람들보다 내 실행시간이 확연히 느렸다. 다들 Buffer를 사용하고 있었는데...(゜ー゜

📍 입력

입력방식 별 속도

다음은첫째 줄에 정수의 개수 N (= 10,000,000), 둘째 줄부터 N개의 줄에 한 개의 자연수(10,000 이하)가 적힌 파일을 입력받는데 걸리는 시간을 측정. 10번 측정해서 평균값으로 순위를 매긴 결과이다. (출처)

Buffer 방식은 0.65초, Scanner는 4.84초로 큰 차이가 난다!

💡 Scanner

Scanner는 익숙하고 간편하다는 장점이 있지만, 속도가 느리다.

Scanner는 next(), nextInt() 등의 메서드에서 정규식을 검사하는 과정이 길다.
따라서 예외적인 입력 값에 대해서도 정확하게 처리해주지만, 속도가 매우 느려지는 것!

import java.util.Scanner;
Scanner sc = new Scanner(System.in);

String a = sc.next();		//문자열
int a = sc.nextInt();		//정수
double a = sc.nextDobule();	//실수

💡 BufferedReader

  1. Buffer는 정규식을 검사하지 않으니 빠르다.
  2. Buffer에 입력받은 문자를 쌓아두고, '한번에' 문자열처럼 보내니 빠르다.
import java.io.BufferedReader;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

String input = br.readLine();

br.close();	//br 사용 후 close 하기!

Buffer 사용시 주의점

  1. 예외처리 필수 (throws IOException BufferedReader)
  2. String이 아닌 다른 타입으로 저장하려면 형변환 필요!
int input = Integer.parseInt(br.readLine());
  1. Buffer를 사용하니, 입력이 끝나면 br.close()를 하자

StringTokenizer

Buffer를 활용하여 readLine()으로 줄 단위로 입력을 받은 후, 공백으로 데이터를 구분하려면?

StringTokenizer를 사용하면 String을 쪼갤 수 있다! (readLine()은 String으로 저장된다.)

import java.util.StringTokenizer;
        StringTokenizer st = new StringTokenizer(input);
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());

📍 출력

출력도 당연히 System.out.println("")를 써왔는데... 출력 양이 많아지면 BufferedWriter를 사용하는 것이 빠르다고 한다!

  1. print'ln'과 달리, 줄바꿈이 자동으로 되지 않으니 +"\n"을 붙여주자!
  2. 버퍼를 사용하니 출력 후 flush()close() 필수!*

BufferedWriter

import java.io.BufferedWriter;
    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        String output = "Hello";
        bw.write(output+"\n");
        
        bw.flush();
        bw.close();

백준 1000번

문제 링크

아래는 Scanner를 사용했던 코드이고, 위는 Buffer를 사용하여 수정한 것이다.
메모리와 속도 모두 개선된 것을 확인할 수 있다!

  • Scanner 사용
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int a = sc.nextInt();
        int b = sc.nextInt();

        System.out.println(a+b);
    }
}
  • Buffer 사용
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        //입력
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String input = br.readLine();	//read()아님!!

        StringTokenizer st = new StringTokenizer(input);
        int a = Integer.parseInt(st.nextToken());
        int b = Integer.parseInt(st.nextToken());

        //출력
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        bw.write(a+b +"\n");  //"\n" 추가
        bw.flush();
        bw.close();
    }
}

참고자료

0개의 댓글

관련 채용 정보