/ ALGORITHM, JAVA

IO speed - 입출력 속도 비교 및 자바 입출력 방법

오늘은 간단히 입출력 방법에 대해 정리해보고자 한다.

알고리즘 문제를 풀다보면 입출력으로 인해 시간 초과가 발생하는 경우가 있다.
백준 사이트에서 입출력 속도를 비교한 것을 보고 어떤 입출력을 사용하는 것이 속도 측면에서 나은지 살펴보자.
입력 속도 비교 / 출력 속도 비교

입력

입력은 자바 기준으로 Scanner보다 BufferedReader와 Integer.parseInt를 사용하는게 약 7배 빠른 것을 알 수 있다.
문제 풀이를 위한 한 줄 라인 입력은 아래와 같이 받을 수 있다.

BufferedReader br = new BufferedReader(new inputStreamReader(System.in));
// 한 줄에 integer input 하나인 경우
int input = Integer.parseInt(br.readLine());
// 한 줄에 여러 input이 공백을 구분자로 두고 있는 경우
StringTokenizer st = new StringTokenizer(br.readLine());
int number1 = Integer.parseInt(st.nextToken());

출력

출력은 BufferedWriter를 쓰는것이 System.out.println(sb)을 쓰는 것보다 빠르나 차이가 미미하기 때문에 조금 더 편리한 System.out.println(sb)를 사용하는게 좋겠다.

C++의 경우

C++은 출력에서 cout « i « endl을 사용할 경우 시간 초과가 날 수 있다. endl대신 "\n"을 이용하자.
C++에서 빠른 입출력을 원할 경우 C 표준 입출력을 동기화하는 ios_bas::sync_with_stdio(false); 설정을 해주고 cin.tie(null);을 통해 cin과 cout을 분리해준다. 물론 그냥 C의 표준입출력 scanf/printf를 사용해도 된다.