프로그래머스 LV1 두 정수 사이의 합 연습문제

프로그래머스 LV1 두 정수 사이의 합 연습문제

2021, Apr 02    

프로그래머스 lv1 두 정수 사이의 합(연습문제)

문제 설명
두 정수 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

풀이

# 잘못된 풀이
def solution(a,b):
    if a == b:
        return a
    elif a > b:
        a, b = b, a
        c = list(range(a,b+1))
    else:
        c = list(range(a,b+1))
    return sum(c)

if __name__ =='__main__':
    a = 5
    b = 3
    print(solution(a,b))


# 위 코드를 테스트 해본 결과 5,6,7,8,9,10에서 속도가 좋지 않았다.
>>>
테스트 1  통과 (0.01ms, 10.2MB)
테스트 2  통과 (0.01ms, 10.1MB)
테스트 3  통과 (0.01ms, 10.2MB)
테스트 4  통과 (838.73ms, 746MB)
테스트 5  통과 (567.83ms, 521MB)
테스트 6  통과 (495.00ms, 438MB)
테스트 7  통과 (236.47ms, 215MB)
테스트 8  통과 (370.43ms, 346MB)
테스트 9  통과 (293.96ms, 263MB)
테스트 10  통과 (67.68ms, 67.5MB)
테스트 11  통과 (0.32ms, 10.3MB)
테스트 12  통과 (1.05ms, 10.7MB)
테스트 13  통과 (0.42ms, 10.2MB)
테스트 14  통과 (0.01ms, 10.2MB)
테스트 15  통과 (0.04ms, 10.2MB)
테스트 16  통과 (0.17ms, 10.3MB)
# 다른 사람 풀이. 등차수열로 풀었다. 

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

if __name__ =='__main__':
    a = 2
    b = 3
    print(solution(a,b))


>>>
통과 (0.00ms, 10.2MB)
테스트 2  통과 (0.00ms, 10.2MB)
테스트 3  통과 (0.00ms, 10.2MB)
테스트 4  통과 (0.00ms, 10.1MB)
테스트 5  통과 (0.01ms, 10.1MB)
테스트 6  통과 (0.00ms, 10.2MB)
테스트 7  통과 (0.01ms, 10.2MB)
테스트 8  통과 (0.00ms, 10.1MB)
테스트 9  통과 (0.00ms, 10.1MB)
테스트 10  통과 (0.00ms, 10.2MB)
테스트 11  통과 (0.00ms, 10.2MB)
테스트 12  통과 (0.00ms, 10.2MB)
테스트 13  통과 (0.00ms, 10.2MB)
테스트 14  통과 (0.00ms, 10.1MB)
테스트 15  통과 (0.00ms, 10.3MB)
테스트 16  통과 (0.00ms, 10.2MB)

위 풀이에서 배울 것.
숫자가 공차 1로 일정하므로 abs(a-b)+1로 전체 숫자 개수 n을 구했다.
abs(x) 절대 값.
/ = 나누기(소숫점 포함)
// = 나누기(소숫점 이하 버리기)
그리고 등차수열. a부터 b까지의 등차수열을 구하면
n(a + l)//2 :첫째항과 끝항을 알 때 등차수열 공식
n{2a+(n-1)d}//2 : 첫째항과 공차 d를 알 때의 공식

#공차 d로 다시 한번 코드를 짜보면

a =3
b =5

print((abs(a-b)+1)*(2*a+(abs(a-b)))//2)

>>> 12

# 다른 사람 풀이2

def adder(a, b):
    return sum(range(min(a,b),max(a,b)+1))

if __name__ =='__main__':
    a = 5
    b = 3
    print(adder(a,b))

위 코드에서 배울 점 min(a,b) max(a,b) 함수를 쓸 생각을 한 것.
함수들을 써서 굉장히 쉽게 풀었음.


출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges