알고리즘_두 정수 사이의 합

charlie_·2021년 9월 4일
0

오늘의 문제

두 정수 사이의 합

풀이

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라는 값을 도출할 수 있다.

틈틈이 수학공부도 해야겠다.....

profile
매일 하루에 딱 한 걸음만

0개의 댓글