반응형
- 지금까지는 화면 입출력에 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을 사용하는 것이 유리
반응형
'JAVA > 기본 문법' 카테고리의 다른 글
[JAVA] 다형성(Polymorphism) 정의 및 활용(UpCasting, DownCasting) + instanceof (2) | 2022.10.03 |
---|---|
[JAVA] 우선순위 큐 (Priority Queue), 정렬 전략 설정법 (0) | 2022.05.28 |
[JAVA] 파일 입출력(BufferedReader, PrintWriter) , 파일 경로 (0) | 2022.04.18 |
[JAVA] 화면 입력 받기 (Scanner) (0) | 2022.04.18 |
[JAVA] 시간 관련 ( 시간측정, 현재날짜/시간, 날짜/시간 포맷, 타이머 ) (0) | 2022.04.14 |