codekata

[프로그래머스] #22 두 정수 사이의 합 (range(start,stop,step))

kinggoddino 2024. 7. 19.

▶ 문제

두 정수 a, b가 주어졌을 때 a와 b 사이에 속한 모든 정수의 합을 리턴하는 함수 solution 만들기

ex) a = 3, b = 5인 경우, 3+4+5=12 이므로 12를 리턴한다.

 

▶ 제한조건

a와 b가 같은 경우는 둘 중 아무 수나 리턴

a와 b는 -10,000,000 이상 10,000,000 이하인 정수

a와 b의 대소관계는 정해져 있지 않음

 

▶ 풀이

a 부터 b 까지 범위를 지정해준 다음에 하나씩 다 더한다.

큰수부터 작은수를 더하는거나, 작은수부터 큰수를 더하는거나 의미는 똑같으니까 range(a,b)를 쓰든 range(b,a)를 쓰든 상관없지 않을까

 

근데 문제는 range의 (start, stop) 에서 stop 은 미포함이라는점 ㅜ

range(a, b+1) 로 범위를 지정하자니 b가 더 작은 수일 경우에는 성립하지 않는다... 그러면 그냥 b를 따로 더해준다. 어차피 정수의 합이니까!

 

근데 또 그렇게 하면 a=b 일 경우에 두번 더하는 셈이 되어버리니까 따로 빼주기

def solution(a, b):
    total = b             # b는 따로 더해줌
    if a == b:            # a, b가 같으면
        return total      # 그냥 반환
    for i in range(a,b):
        total += i
    return total          # 틀림.....

틀림ㅠ

 

range(start, stop) 에서 start 가 더 크면 안되나?

실험해보기

for i in range(1,5):    # start < stop
    print(i)            # 1 2 3 4

for i in range(5,1):	# start > stop
    print(i)            # 아무것도 안나옴

진짜 안되네

 

찾아본 결과!!!

큰수에서 작은수를 지정할 때는 step을 추가해서 지정해야함. range(start, stop, step)

for i in range(5,1,-1):
    print(i)            # 5 4 3 2

 

그럼 a > b 인경우를 따로 나눠주기

def solution(a, b):
    total = b                       # b는 미포함이니 따로 더한다
    if a < b:                       # a가 작은 수면
        for i in range(a,b):        # a ~ b (+1) 간격으로
            total += i              # total에 하나씩 더한다
    elif a > b:                     # a가 큰 수면
        for i in range(a,b,-1):     # a ~ b (-1) 간격으로
            total += i              # total에 하나씩 더한다
    return total                    # total 반환

통과!

 

+

다른사람 풀이 보고 공부해봤는데

a < b, b > a 의 경우를 따로 나누지 않고 b > a 일 경우 두 값을 바꿔주는 방식을 쓰면 범위를 한번에 지정할 수 있다.

두 값을 서로 바꾸기 : a, b = b, a

그리고 굳이 total 변수에 하나씩 더하지 않고 그냥 sum()함수를 써도 된다.

range() 범위도 sum()으로 합산할 수 있다

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

통과!