JavaScript/알고리즘

프로그래머스 두 정수 사이의 합 JS ( for문 / 가우스 합계)

hihiha2 2023. 9. 2. 00:30

🧷링크

문제 설명

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수, solution을 완성하세요.
예를 들어 a = 3, b = 5인 경우, 3 + 4 + 5 = 12이므로 12를 리턴합니다.

 

 

 

🙋‍♀️ 내 생각

a===b인 경우는 둘중 아무 수나 리턴하면 되기때문에 생각하기 어렵지 않다.

 

a와 b사이의 값들을 더하기 위해서, for문을 사용해서 a와 b 사이라는 범위를 지정하고 그 안에서 1씩 더하거나 빼는을 써야겠다고 생각했다.

(a=3, b=5이면 3부터 시작해서 5까지(범위), 3,4,5처럼 1차이 나게)

 

그런데 a가 더 클 경우와, b가 클 경우로 나뉘기 때문에 a===b일 경우를 제외하고는 a>b, b>a로 경우를 나누어서 어디부터 시작해서, 더할지 뺄지를 다르게 지정해주어야한다.

 

 

✅ 내 코드

function solution(a, b) {
    let sum = 0;
    
    if(a<b) { 
        for(i=a; i<=b; i++){
        sum += i
        } 
    } else if (a>b){
        for(i=a; i>=b; i--){
        sum += i
        }    
    }
    
    return a===b? a : sum

}

우선, 더한 값을 저장할 계산기 역할을 할 변수를 sum이라는 이름으로 만들고 초기값으로 0을 넣는다.

for문을 반복하면서, 더해진 값들을 저장하고 최후에 리턴될 값이다.

 

그런 다음 a<b, b>a일 경우에 1️⃣ 범위, 2️⃣ 시작점부터 1씩 더할지(i++) / 뺄지(i--) 를 나누어서 생각해야하기때문에 if문으로 분기처리한다.

1. a<b 일 경우

a<b인 경우는 a=3, b=5와 같은 경우이다. 그래서 범위의 시작점을 a로 잡아서 +1씩 해나가고 끝지점을 b로 잡는다.

for(i=a; i<=b; i++)

for문을 돌면서 i값을 sum에 더한다.

sum += i

i=b까지만 반복하고 범위를 넘어가면 for문을 빠져나온다.

 

2. b<a 일 경우

이와 반대로 b<a인 경우는 a=5, b=3과 같은 경우이다. 범위의 시작점을 a로 잡고 -1씩하고 끝지점을 b로 잡는다.

for(i=a; i>=b; i--)

for문을 돌면서 i값을 sum에 더한다.

sum += i

i=b까지만 반복하고 범위를 넘어가면 for문을 빠져나온다.

 

여기까지하면 a===b인 경우를 제외하고는 sum에 값이 담겨있을 것이다.

 

 

이제 마지막으로 a===b인 경우를 처리하기 위해서 삼항연산자를 이용한다.

a===b? 가 true라면 a나 b중 아무거나 하나를 리턴하고, false라면 sum을 리턴한다.

return a===b? a : sum

 

 

 

 

 

✔️  개선할 점

function solution(a, b) {
    let sum = 0;
    let start = Math.min(a, b); // 두 정수 중 더 작은 값으로 시작
    let end = Math.max(a, b);   // 두 정수 중 더 큰 값으로 종료
    
    for (let i = start; i <= end; i++) {
        sum += i;
    }
    
    return sum;
}

위에 a<b, b>a를 if문을 통해 경우를 나누어도 되지만 이것을 Math.minMath.max을 통해서 변수에 저장해서 풀면 가독성이 더 올라간다.

 

우선, 더한 값을 저장할 변수 sum을 선언하고 0으로 초기화한다.

그리고 범위를 지정할때 더 작은값부터 시작해서 큰값으로 끝나게 해야하므로 최소값을 구하는 Math.min, 최대값을 구하는 Math.max를 이용해서 두 수 중 큰값과 작은 값을 구한다.

(범위지정에 이용하기 위해서 구함!!)

 

둘 중 더 작은 값을 start라는 이름의 변수에 담고, 더 큰 값을 end라는 이름의 변수에 담는다.

 

그리고 for문을 만드는데 범위를 start부터 시작해서 end까지로 지정한다.

이렇게 하면 위에 원래 만들었던 코드와 동일하게 3,4,5..+1씩 범위를 더하면서 for문을 돌때마다 sum에 값을 축적한다.

 

그리고 마지막으로 sum을 리턴한다.

 

위에 원래짰던 코드와 로직은 거의 같지만, for문을 한번만 돌려도 되는것과 if문으로 분기처리하는 대신 범위를 지정할 값들을 변수에 넣음으로서 가독성이 훨씬 올라갔다. 구현이 가능하더라도 되도록이면 이런식으로 자연스럽게 짤 수 있도록 연습을 많이 해야겠다.

 

 

 

 

 

💻  다른사람 코드중에 배울 것

function solution(a, b){ 
    return (a+b) * (Math.abs(a-b)+1) / 2;
}

위 코드는 수학적인 원리를 이용하여 푼 코드이다.

 

🖥 가우스 합계

가우스 합계연속된 숫자의 합을 간단하게 계산하는 수학적인 원리이다.

두 수의 시작점과 끝점을 알때, 두 수 사이에 들어있는 값들의 합을 쉽게 구할 수 있다.

 

공식

Sum = (a + b) * (b - a + 1) / 2

예를 들어, 1과 100사이의 수들을 모두 더 하고 싶을때 (1+100)*(100-1+1)/2를 통하면, 일일이 수를 더하지 않더라도 답을 쉽게 구할 수 있다.

 

위의 문제는 a와 b중 어떤 값이 시작점이고 끝점인지가 정해져 있지 않기때문에 Math.abs()를 통해서 뺄셈한 값을 절댓값으로 만드는 과정을 거친다. 그것만 제외하면 가우스합계 공식만을 이용하여 풀었다.

 

두 수의 사이의 값들을 모두 더할 때 유용한 공식이므로 알아두면 훨씬 간단하게 코드를 작성할 수 있을 것 같다.