1부터 더했을 때 그 합이 500 이상이 되는 최소 정수값 구하기2 - 반복문을 사용하지 않는 이유

MIN.DI·2021년 4월 25일
0

TIL

목록 보기
4/15

이전 글 (클릭시 이동) 에서 반복문(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);

프로그램 실행시간을 확인하고 싶을 때 템플릿처럼 사용할 수 있다!

profile
내가 보려고 쓰는 블로그

0개의 댓글