지금까지는 java에서 입력을 받기 위해 Scanner를 사용해왔는데, 백준에서 입출력 기본문제들을 풀다보니 다른 사람들보다 내 실행시간이 확연히 느렸다. 다들 Buffer를 사용하고 있었는데...(゜ー゜)
다음은첫째 줄에 정수의 개수 N (= 10,000,000), 둘째 줄부터 N개의 줄에 한 개의 자연수(10,000 이하)가 적힌 파일을 입력받는데 걸리는 시간을 측정. 10번 측정해서 평균값으로 순위를 매긴 결과이다. (출처)
Buffer 방식은 0.65초, Scanner는 4.84초로 큰 차이가 난다!
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(); //실수
- Buffer는 정규식을 검사하지 않으니 빠르다.
- Buffer에 입력받은 문자를 쌓아두고, '한번에' 문자열처럼 보내니 빠르다.
import java.io.BufferedReader;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String input = br.readLine();
br.close(); //br 사용 후 close 하기!
- 예외처리 필수 (throws IOException BufferedReader)
- String이 아닌 다른 타입으로 저장하려면 형변환 필요!
int input = Integer.parseInt(br.readLine());
- Buffer를 사용하니, 입력이 끝나면 br.close()를 하자
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를 사용하는 것이 빠르다고 한다!
- print'ln'과 달리, 줄바꿈이 자동으로 되지 않으니
+"\n"
을 붙여주자!- 버퍼를 사용하니 출력 후
flush()
와close()
필수!*
import java.io.BufferedWriter;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String output = "Hello";
bw.write(output+"\n");
bw.flush();
bw.close();
아래는 Scanner를 사용했던 코드이고, 위는 Buffer를 사용하여 수정한 것이다.
메모리와 속도 모두 개선된 것을 확인할 수 있다!
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);
}
}
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();
}
}