사실 오늘은 크게 공부한 것은 없고 복습을 했다.
Rect 알아가기 포스트를 쓰면서 리액트의 장단점과 리액트에 대해서 조사를 했다.
내 실력은 초보자이기에 연습문제를 풀면서 익히고 있었는데 연습을 하면서 놀랐던 부분이 있어서 적어본다.
내가 생각한 풀이는 a ~ b, b ~ a합을 리턴하면 되므로 for문을 돌려서 구하면 되겠다고 생각을 했다.
function solution(a, b) {
var answer = 0;
if(a < b){ /// a가 b보다 작을때
for(let i = a; i <= b; i++){ /// a ~ b까지 수를 더한다.
answer += i;
}
}else if(a > b){ /// a가 b 보다 클때
for(let i = b; i <= a; i++){ /// b ~ a까지 더한다.
answer += i;
}
}else{ /// 위의 두 경우가 아니라면 (a = b) 라면
return a; /// a를 반환한다.
}
return answer;
}
그런데 다른사람의 풀이를 보았다.
function adder(a, b){
var result = 0
return (a+b) * (Math.abs(a-b)+1) / 2;
}
이거 보고 이게 도대체 무슨소리인가 싶었다. 알아보니 등차수열의 합이었다.
등차수열 = 첫 항과 마지막 항을 더한 뒤 항의 개수를 곱하고 2로 나눈 값
function adder(a, b){
var result = 0
return (a+b) // 첫 항과 마지막 항을 더한 수
* (Math.abs(a-b)+1) // 항의 개수(개수를 세야하기 때문에 절대값)
/ 2; // 나누기 2
}
Math.abs는 절대값 구하는 매서드
이걸 보고서 수학을 놓은지 너무 오래되었구나. 이렇게 알아가면서 수학도 배워가며 공부해야겠다. 세상에는 똑똑한 사람들이 많구나. 반성하며 이러한 풀이법을 기억해 놔야겠다. 풀면 풀수록 고민하고 해결할수록 새로운 지식을 얻을수록 재밌는 게 알고리즘인 것 같다.