function solution(a, b) { let sumA = 0; let sumB = 0; if( a > b) { sumA = a*(a+1)/2, sumB = (b-1)*b/2; return sumA - sumB; } else { sumA = (a-1)*a/2, sumB = b*(b+1)/2; return sumB - sumA; } }
1부터 n까지의 합을 계산하는 n(n+1)/2 공식을 사용했다. a와 b의 값을 비교하여 큰 값의 합에서 작은 값의 합을 빼는 방식으로 접근했다.
예를 들어 a = 5, b = 3일 때, 1 ~ 5까지의 합(sumA)에서 1 ~ 2까지의 합(sumB)을 뺐고, 반대로 a = 4, b = 5일 때는, 1 ~ 5까지의 합(sumB)에서 1 ~ 3까지의 합(sumA)를 뺐다.
풀고 나니 보다 효율적인 방법이 있을 것 같아 다른 사람들의 풀이를 살펴봤다. 그리고 난 엄청난 충격에 빠졌다.
function adder(a, b){ return (a+b)*(Math.abs(b-a)+1)/2; }
위의 코드는 a부터 b까지의 산술평균을 구하는 (a+b)n/2 공식을 사용했다. 여기서 n은 a부터 b까지의 더할 숫자의 개수를 의미한다. 즉 (a+b)n/2
는 (a+b)(b-a+1)/2
와 같다. 그리고 개수를 셀 때 음수는 필요없으므로 (b-a)의 절대값을 구하기 위해 Math.abs
메소드를 사용했다.
예를 들어 a = -10, b = 3일 때, 위의 식에 대입하면 (-10 + 3)(|-10 - 3| + 1) / 2
이므로 -7 * (|-13| + 1) / 2 = -49라는 값을 도출할 수 있다.
틈틈이 수학공부도 해야겠다.....