두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다
제한 조건
a와 b가 같은 경우는 둘 중 아무 수나 리턴하세요.
a와 b는 -10,000,000 이상 10,000,000 이하인 정수입니다.
a와 b의 대소관계는 정해져있지 않습니다.
a와 b의 대소관계를 파악하고,
작은 수부터 큰 수까지 사이 수를 구하고,
그 수를 모두 더하자.
문제의 목적자체가 어렵지 않기때문에 효율적은 코드를 짜는게 관건이 될 듯
function solution(a, b) {
var answer = 0;
if(a < b){
for(let i = a ; i <= b; i++){
answer += i
}
}else{
for(let i = b ; i <= a; i++){
answer += i
}
}
return answer;
}
문제를 직독직해한 코드. 당연히 통과는 한다. 하지만 이 코드는 효율성, 코드 가독성, 간결성 측면에서 최적화가 부족하게 보인다. 또한, 작은수에서 이렇게 +=
사용해 모두 더하는 것은 문제가 없지만 수가 커질 수록 비효율적일 수 있다. 그래서 검색을 해봤다. 두 숫자 사이의 합을 한번에 계산하는 공식이 있지 않을까?
이 공식을 보고 a와 b를 비교해서 먼저 큰 수를 찾아야겠구나 생각했다.
function solution(a, b) {
const start = Math.min(a,b)
const end = Math.max(a,b)
return (start + end) * (end - start + 1) /2
}
근데 풀이를 하고 다른 사람 풀이를 보니
return (a+b) * (Math.abs(a-b)+1) / 2;
Math.abs() 메서드를 생각을 못했다..!
Math.min()
가장 작은 값을 찾는 메서드다. 배열에서 활용할땐 아래와 같다. 배열의 값들을 스프레드 연산자(...)로 펼쳐서 Math.min()에 전달하여 가장 작은 값을 찾을 수 있다.
const numbers = [15, 3, 8, 22, 7];
console.log(Math.min(...numbers)); // 3
Math.max(x)
가장 큰 값을 반환하는 함수다. 여러 인수를 입력받아 그중 가장 큰 숫자를 찾아줍니다. 인수를 제공하지 않으면 반환값은 -Infinity이다.
Math.abs()
내가 기억하지 못했던 바로 Math.abs()!
Math.abs()는 주어진 숫자가 양수일 경우 그대로 반환되고, 음수일 경우에는 그 음수를 양수로 바꾸어 반환한다. 절대값을 구할 때는 다양한 상황에서 유용하다. 특히, 두 값의 차이를 구할 때 차이가 양수로 표현되어야 할 경우 아주 유용하게 쓸 수 있다.
링크
두 정수 사이의 합