Programmers Coding Quiz #8 두 정수 사이의 합

김기욱·2021년 1월 29일
0

코딩테스트

목록 보기
8/68

문제 설명

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

풀이

우선 사잇값 (예제인 5와3의 경우 2)을 구하기 위해선 (큰값-작은값)을 구해야 합니다.
전 그래서 input된 인자들을 리스트에 담고 maxmin 함수를 써서 판별해냈습니다
사잇값을 구하면 사잇값을 range로 돌려 사잇값만큼 1씩 증가하는 요소들이 포함되어있는 리스트들을 구합니다.
range의 마지막 인덱스는 포함되지 않습니다. 하지만 문제에서는 3부터 5까지 3,4,5 3개의 요소가 모두 포함되어야 하므로 사잇값+1을 해서 사잇값 마지막까지 for loop가 돌도록 합니다.

다음으로는 두 인자가 똑같은 경우는 바로 a를 리턴하면 되니, 삼항연산자로 처리해줍니다.
그래서 나오는 한줄코드..지만 가독성이 오늘도 상당히 떨어집니다.
시간 복잡도 측면에서도 무조건 리스트를 만들어야 하니 썩 좋아보이진 않습니다.

def adder(a, b):
    return a if a == b else sum([min([a, b]) + i for i in range(max([a, b]) - min([a, b]) +1)])

다른풀이

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

이거야말로 수학적으로 깔끔한 접근법이 아닌가 싶네요. 평균을 활용해 정말 간단하게 풀어버렸습니다.
사잇값은 결국 두 수의 절대값입니다. 절대값에 +1을 해주고 두수의합 * 3 // 2 를 통해 간단히 해결해버렸습니다. 따지고 보면 3, 4, 5 는 평균값인 4, 4, 4랑 똑같습니다
3, 4, 5, 6 도 4.5, 4.5, 4.5, 4.5(두수의 합//2 == 평균)랑 똑같죠.

그러므로 순서만 살짝 바꿔서 두 수의 합에서 사잇값을 우선 곱해주고 마지막에 정수만 반환하는 나누기인 //2 해주면 되겠네요.

간혹 프로그래밍의 기능과 함수에만 치중해 기본적인 수학개념으로 간단히 풀수 있는걸 놓치곤 합니다.
반성해야겠네요. 😣

profile
어려운 것은 없다, 다만 아직 익숙치않을뿐이다.

0개의 댓글