본문 바로가기
Developer/Algorithm

Programmers 프로그래머스 코딩테스트 연습 - 두 정수 사이의 합 (JavaScript)

by roqkfrlfhr 2020. 8. 17.

Programmers 프로그래머스 코딩테스트 연습 - 두 정수 사이의 합 (JavaScript)

 

Programmers(프로그래머스)의 코딩테스트 연습문제 Level 1 중,

두 정수 사이의 합 문제를 JavaScript로 해결해 보도록 하겠습니다.

 

 

문제 설명

두 정수 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 return
3 5 12
3 3 3
5 3 12

 

 

작성한 답

solution.js

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

 

설명

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수를 작성하는 문제입니다.

가령 1에서 10 까지에 속한 모든 정수의 합은 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 = 55 와 같은 결과를 만들어내는 문제입니다.

그냥 문제를 그대로만 생각해본다면 Parameter로 들어오는 a 와 b 중 작은 수와 큰 수를 구분해 for 문과 같은 반복문을 돌려서 a와 b 사이에 속한 모든 정수의 합을 더해준 뒤 반환해야겠다 생각할 수도 있지만,

그것보다도 훨씬 간단한 방법이 있습니다.

바로 가우스 공식이라 불리는 등차수열의 합 공식을 사용하면 됩니다.

가우스 공식, 등차수열의 합 공식 이란, 가우스가 10살 때, 선생님이 학생들을 조용하게 하기 위해 1부터 100까지를 더하는 문제를 냈는데 다른 학생들은 1부터 100 까지 모든 숫자를 순서대로 더하고 있었지만 가우스는 순식간에 답을 제출해낸 유명한 공식입니다.

공식을 풀어 설명하자면 1부터 100까지를 더한다면 그에 역순인 100부터 1까지를 순서대로 더하고(1+100, 2+99, 3+98, 4+97,5+96...), 그럼 각각 더한 101이란 숫자가 100개가 나오게 되고 그의 합은 10100인데, 실제 더하려고 하던 1부터 100까지의 수에서 추가로 역순인 100부터 1까지의 수가 한번 더 추가된 꼴이니 10100의 값에 나누기 2를 하면 정답인 5050이 나옵니다.

이것을 공식으로 작성하면 n(x+y)/2 가 됩니다. 여기서 x는 작은 수, y는 큰 수, n은 x와 y 사이의 정수의 개수 입니다.

n(x+y)/2 공식에서 n을 다시 x와 y로 구해서 x와 y로만 표현한 공식은, ((y-x)+1)(x+y)/2 가 됩니다.

그럼 우리는 다른 학생들과 같이 1부터 100까지를 순서대로 더하는 반복문이 아닌 가우스가 우월하게 풀어낸 방식인 등차수열의 합 공식인 ((y-x)+1)(x+y)/2를 사용하여 문제를 해결해 보겠습니다.

((y-x)+1)(x+y)/2에서 x와 y는 x < y의 관계입니다.

그렇기에 처음에 x와 y사이의 수의 개수를 구할때 x와 y의 차를 알기 위해서 더 큰 수인 y 에 더 작은 수인 x 를 빼는 y-x를 했습니다.

하지만 문제에는 "a와 b의 대소관계는 정해져있지 않습니다." 라는 제한 조건이 있기때문에 두 변수의 차를 구할때 Math.abs(a - b)로 절대값으로 구해주면 a와 b의 차를 구해주면 됩니다.

그리고 나머지는 공식 그대로 사용하시면 아주 쉽게 답을 구하실 수 있습니다. 

(장황한 설명 죄송합니다.)

 

 

 

도움이 되셨다면 공감, 댓글 부탁드립니다!

궁금하신 점이나 요청 사항은 언제든지 말씀 해주세요!

 

감사합니다.


댓글