[JS] 프로그래머스 - 두 정수 사이의 합

나쿠크·2024년 10월 11일
0
post-thumbnail

🥇문제

두 정수 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()는 주어진 숫자가 양수일 경우 그대로 반환되고, 음수일 경우에는 그 음수를 양수로 바꾸어 반환한다. 절대값을 구할 때는 다양한 상황에서 유용하다. 특히, 두 값의 차이를 구할 때 차이가 양수로 표현되어야 할 경우 아주 유용하게 쓸 수 있다.


링크
두 정수 사이의 합

0개의 댓글