[ETC] Performance about algorithms

ETC

알고리즘 테스트에는 채점, 확인 프로그램이 사용됩니다.
이 입력값 대비 출력값이 올바른지(알고리즘 구조가 맞는지), 속도는 어느정도인지, 메모리는 얼마나 사용하는지 등..
만약 올바른 알고리즘이라도 속도나 메모리 사용을 초과하면 잘못된 풀이로 판단합니다.

오늘은 알고리즘 테스트와 관련하여 속도에 대해서 이야기해볼가 합니다.

보통 테스트를 볼때 주 언어를 하나 선택해서 문제를 풉니다.
특히 어떤 입력을 받아 한줄 또는 여러줄에 걸쳐 출력을 하는 알고리즘 문제가 많이 출제됩니다.

시스템 입출력 함수, 클래스는 꽤 많습니다.
여러분은 어느정도나 알고있나요?
주로 사용하는 입출력 함수, 클래스의 속도에 대해서 생각해보신적 있나요?

먼저 bupjae님께서 작성한 수행시간 비교를 보여드릴게요
출처는 https://algospot.com/forum/read/2496/ 여기입니다.
시간나시면 정독을 추천합니다.

저같은 경우에는 java.util.Scanner를 자주 사용하는데 같은 입출력 클래스인 java.io.BufferedReader에 비해서 무려 6배나 오래걸립니다.
습관을 떠나 이정도 속도차이면 분명히 알고 개선해야할 부분이라고 개인적으로 생각했습니다.
특히나 수행시간을 타이트하게 잡은 문제일수록 BufferedReader를 써야함에는 이견이 없을겁니다.
뭔가 더 공부할 수 있고 습관을 바꿀 수 있는 계기를 마련해준 알고리즘 문제에 감사함을 느꼈습니다.

만약 여러분도 기회나 여유가된다면 알고리즘 문제를 풀어보시길 꼭 추천드립니다.

메모
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.io.IOException;

public class Main {
public static void main(String[] args) {
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st = null;

int count = Integer.parseInt(br.readLine());

for(int i = 0; i < count; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
int c = a + b;
bw.write(c + "\n");
}
bw.flush();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}