이전 글 (클릭시 이동) 에서 반복문(for문)을 이용한 방법과, 가우스의 덧셈을 이용한 방법으로 각각 문제를 풀어보았다.
이번에는 같은 문제를 숫자만 더 크게 바꿔서 풀어보고, 각각 경과시간이 얼마나 걸리는지 확인해보자!
차이를 확실히 하기 위해 숫자를 확 키워서,
1부터 더했을 때 그 합이 900,000,000,000,000 이상이 되는 최소 정수값을 구한다.
for문
1 long startTime = System.currentTimeMillis(); //현재 시각을 구하는 메소드
2 long sum = 0;
3 long num = 0;
4
5 for (num=1; ; num++){
6 sum += num;
7 if (sum >= 900000000000000L)
8 break;
9 }
10
11 System.out.println("num : " + num);
12 long endTime = System.currentTimeMillis();
13 System.out.println("경과시간 : "+(endTime-startTime)+"ms" );
2~11번 라인
이 문제의 풀이이고,
나머지 라인은 경과시간을 구하는 풀이이다.
System.currentTimeMillis();
는 옆에 주석에도 썼듯이 현재 시각을 나타내는 메소드인데, 값을 밀리세컨드 단위로 반환한다.
1번 라인
에서 실행 시작 시각을 구하고, 12번 라인
에서 실행 종료 시각을 구해서 두 값의 차이를 구하면 경과시간을 확인할 수 있다.
위 코드를 실행하면
num : 42426407
반복문 경과시간 : 23ms
요렇게 출력된다.
가우스의 덧셈
이번엔 반복문이 아닌 수학공식으로 계산해보자.
1 startTime = System.currentTimeMillis();
2 sum = 900000000000000L;
3
4 double f = ( -1 + Math.sqrt( 1 - 4 * (-2 * 5 sum)) )/2; //근의공식
6 int n = ( (f - (int)f) > 0) ? (int)(f+1) : (int)f;
7
8 System.out.println("n : " + n);
9 endTime = System.currentTimeMillis();
10 System.out.println("가우스 경과시간 : "+(endTime-startTime)+"ms" );
여기서도 마찬가지로 2~8번 라인
이 문제의 풀이이고, 나머지 라인은 경과시간을 구하는 코드이다.
(문제 풀이는 이전 글에 있다.)
이 코드를 실행하면
num : 42426407
가우스 경과시간 : 0ms
이런 결과가 나온다.
두 풀이 모두 답은 똑같이 나왔지만, 값을 출력하기까지의 시간은 반복문이 더 오래 걸렸음 을 알 수 있다. (반복문 26ms, 가우스 0ms)
간단한 계산이라 큰 의미는 없지만, 식이 복잡해질수록 큰 차이가 있으니
수학적 접근 방법을 고민해보는 습관을 가져야겠다.
long startTime = System.currentTimeMillis();
long endTime = System.currentTimeMillis();
System.out.println(endTime-startTime);
프로그램 실행시간을 확인하고 싶을 때 템플릿처럼 사용할 수 있다!