[알고리즘] 두 정수 사이의 합

DongGyu Jung·2021년 11월 14일
0
post-thumbnail

※ 본 사진과 해당 게시글 내용의 문제 모두 프로그래머스[Programmers]사이트에 발췌해왔습니다.

💬 들어가기 앞서..

💢 가우스의 등차수열의 합 공식 이란?

아마 많은 분들이 알고 계실테니 짧게 설명해보도록 하겠습니다.
유명한 문제였죠?
1부터 100까지의 공차가 1인 수열(100! _팩토리얼)의 합을 구해야하는 문제를 "(초항과 끝항의 합) * (항 수) / 2" 라는 방법으로 해결하였습니다.
위 공식이 등차수열 합을 구하는 기본 원리입니다.

초등학교 시절엔 위의 방법으로 구했지만
고등학교 시절에 심화되어 배웠던 등차수열의 합이 있습니다.
첫째 항 = a
공차 = d (배열 간격이라고 이해하시면 될 것 같습니다.)
길이or개수 = n
라고 했을 때
등차수열의 합은 " a + (a+d) + (a+2d) + ... + {a+(n-2)d} + {a+(n-1)d} " 이 됩니다.
이 공식에 "(초항과 끝항의 합) * (항 수) / 2" 라는 방법을 적용시키면
" n {2a+(n-1)d} / 2 "* 가 됩니다.


※ 출처 ㅣ


❓ 문제

두 정수 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 

❗ 풀이

My Code

def solution(a, b):
    if a > b :
        ls = [num for num in range(b,a+1)]
    else :
        ls = [num for num in range(a,b+1)]
    return sum(ls)

단순하고 투박하다.
대소관계에 따라 range()에 올 첫 값과 끝 값을 별도로 지정해주고
ls라는 변수에 담아준 후, sum() 함수를 사용하였다.

조금 더 센스있고 깔끔하게 설계할 수 있도록 더 공부해야겠다..

❣ 다른 풀이

(1)

def adder(a, b):
    if a > b: a, b = b, a
    return sum(range(a,b+1))

크게 보았을 때,
의미는 나의 풀이와 같지만
각 조건에 따른 값들을 별도로 저장하지 않고
대소관계를 먼저 비교해서 range(a, b+1)에 올 a,b의 값을 절대적으로 바꿔준 방법이다.


(2)

def adder(a, b):
    return (abs(a-b)+1)*(a+b)/2

들어가기 앞서 설명했던
가우스 선생님의 등차수열의 합 공식이 출현하였다..
abs(a-b)+1를 보면 abs(a-b)(절댓값)은 간격의 수이기 때문에 +1을 해서 위에 설명한 n을 구하는 방식이고 (a+b)는 말 그대로 첫 항과 끝 항의 합이다.

알고리즘판에 가우스가 재림하였다...

0개의 댓글