1부터 더했을 때 그 합이 500 이상이 되는 최소 정수값 구하기

MIN.DI·2021년 4월 24일
0

TIL

목록 보기
2/15

문제 : 1부터 더했을 때 그 합이 500 이상이 되는 최소 정수값 구하기

  1. for문을 이용한 풀이
    1-2. for문과 if문을 이용한 풀이
  2. 가우스의 덧셈을 이용한 풀이

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을 해준다.


가능하면 제어문 보다는 수학 공식으로 문제를 푸는것이 좋은데, 그 이유는 다음에 포스팅 하는걸로...ㅎㅎ...
profile
내가 보려고 쓰는 블로그

0개의 댓글