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

devmin24·2021년 8월 7일
0

⏳ 도전! 알고리즘

목록 보기
32/32
post-thumbnail
post-custom-banner

문제 링크

문제

두 정수 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의 대소관계는 정해져있지 않습니다.

입출력 예제

abreturn
3512
333
5312

풀이

a, b 두 정수 사이에 속한 모든 정수의 합을 구하면 되는 문제이다. 여기서 a, b가 같을 경우는 둘 중 아무 값을 반환한다.

function solution(a, b) {
    var answer = 0;
    let num = [];
    if (a === b) {
        answer = a;
    } else {
        num.push(a,b);
        num.sort((a,b)=>a-b); // 오름차순 정렬
        for (let i=num[0]; i<num[1]+1; i++) {
            answer += i
        }
    }
    
    return answer;
}
  • a부터 b까지 순차적으로 for문을 돌리기 위해, a와 b를 담을 빈 배열을 만든다. num=[]
  • a와 b가 같을 경우와 다를 경우의 조건식을 만들어준다.
    같으면 a를 반환하고 다르면 num 배열에 넣어준다.
  • 예제 3번을 보면 a>b의 경우인데, 이럴 경우 for문에서 시작값을 a로 하면 기댓값이 나오지 않는다.
    작은 수부터 시작하여 더해야 하기 때문에, num 배열의 요소들을 오름차순 정렬해준다.

이 문제는 생각할 필요도 없이 간단하게 풀 수 있는 문제였다.
하지만, 다른 사람의 풀이를 찾다가 대단한 것을 발견했다!

다른 사람의 풀이

 return (a+b)*(Math.abs(b-a)+1)/2;

나는 a < b의 경우, a부터 b까지 하나씩 더하여 푸는 방법을 생각했다. (아주 간단)
그러나 이 문제에도 공식이 존재했다!

a < b 일 때,
(a+b)*(b - a - 1)/2 = a부터 b의 합

또, 나는 a > b의 경우를 오름차순 정렬로 해결했는데 Math.abs()메서드를 사용하여 풀어나가는 방법도 있었다.

Math.abs(): 주어진 숫자의 절대값을 반환한다. x가 양수이거나 0이라면 x를 반환하고, x가 음수라면 x의 반대값, 즉 양수를 반환한다.더 알아보기

Takeaway

정말 대단했다. 숫자의 범위가 커질수록 for문을 하나씩 돌리는 것보다 공식으로 풀어내는 것이 훨씬 효율적이기 때문이다. 또, 그 많은 수들을 오름차순 정렬을 하지 않고 음수의 값을 절대값으로 바꾼다니? 이런 것이 좋은 코드라고 할 수 있지 않을까? 실제로 이 코드를 보고 나뿐만 아니라 많은 사람들이 감탄했다!

profile
꾸준함, 열정 한 가득 챙겨 끝없는 목표를 향해 달려가는 개발자👩‍💻
post-custom-banner

0개의 댓글