문제 : 1부터 더했을 때 그 합이 500 이상이 되는 최소 정수값 구하기
- for문을 이용한 풀이
1-2. for문과 if문을 이용한 풀이- 가우스의 덧셈을 이용한 풀이
1. for문을 이용한 풀이
int i;
int sum;
for (i = 1; sum < 500; i++){
sum += i;
}
System.out.println("조건을 만족하는 최소값 = " + (sum - 1));
결과 출력시 (sum-1)
을 하는 이유는, for문이 조건을 충족한 후 i++
로 빠져나오기 때문이다.
이 부분이 헷갈리면 for문 내부에 System.out.println(중간 계산결과 확인)
을 입력해보면 편하다.
for (i = 1; sum <5 ; i++) { //확인하기 쉽도록 조건식의 숫자는 작은 숫자로 입력했다.
sum += i;
System.out.println("중간 계산결과 : " + i + "/" + sum);
}
System.out.println("최종 변수값 : " + i + "/" + sum);
요렇게!
그리고 코드를 실행하면
중간 계산결과 : 1/1
중간 계산결과 : 2/3
중간 계산결과 : 3/6
최종 변수값 : 4/6
이렇게 출력되는데, 중간 계산결과의 i
와 최종 변수값의 i
가 다르다는 것을 확인할 수 있다. 따라서(sum-1)
을 해주어야 함!
1-2. for문과 if문을 이용한 풀이
for문에서 조건식을 주지 않고 if문으로 제어하는 방법도 있다.
for (i - 1; ; i++){
sum+=i;
if ( sum >= 500)
break;
}
System.out.println("조건을 만족하는 최소값 = " + sum);
if문에서 break
를 만나면 그대로 for문을 탈출하기 때문에 최종 변수값이 변하지 않는다.
따라서 이런 경우에는 결과 출력시 (sum-1)
을 하지 않고 sum
만 출력해도 된다.
2. 가우스의 덧셈을 이용한 풀이
가우스의 덧셈이란 1~n까지의 합을 구하는 공식으로,
n(n+1)/2 이다.
이것을 문제에 적용하면
x *
(x+1) / 2 = 500
x *
x + x = 1000
x *
x + x - 1000 = 0
즉 이차방정식이 되고, 근의공식으로 풀이가 가능하다.
x = (-1 + √(1 - (4 *
1 *
-1000 ))) / 2
이 식을 코딩해보면
double gauss = (-1 + Math.sqrt(1 - (4 * 1 * -1000))) / 2 ;
이렇게 된다.
Math.sqrt()
는 루트값을 구하는 메소드이다.
이 코드의 결과를 출력하면
31.12672920173694...
의 값이 나온다.
즉 1 ~ 31.12672920173694...까지의 합이 500 이라는 뜻이고,
문제에서는 합계가 500 이상이 되는 최소 정수값을 요구했으므로 소수점 이하는 올림해주면 된다.
double gauss = (-1 + Math.sqrt(1 - (4 * 1 * -1000))) / 2 ;
int iGauss = (gauss - (int)gauss > 0) ? (int)(gauss + 1) : (int)gauss;
내 의도는 소수점 이하를 올림 해주는것이지만,
double
형을 int
형으로 변환하면 소수점 이하는 버려지기 때문에 +1을 해준다.