상세 컨텐츠

본문 제목

[Python] 1부터 n까지 합계 구하기 파이썬 프로그램 예제

IT & Programming/파이썬 (Python) 공부

by 그림아이 2023. 4. 9. 02:00

본문

반응형

 

이번에는 수학의 신이신 가우스 형님의 어릴 적 유명한 일화에서 인용해봤습니다.

 

가우스 형님이 어렸을 때 학교에서 하도 떠드니까 선생님께서 벌을 주신다면서 불러다가 1부터 100까지 다 더해보라고 시키셨죠. 두어 시간 걸리겠지 하고 수업을 진행하고 있었는데 얼마 지나지 않아 가우스 형님이 계산 다했다고 말합니다. 어떻게 풀었냐고 물어보니 1부터 100까지 숫자를 나열해 놓고 양쪽 끝 수를 더하면101이 되고 그게 50개 있으니 101 X 50 = 5050 이라고 답했다고 합니다. 바로 이렇게 푼 거죠.

1 + 2 + 3 + • • • + 98 + 99 + 100 = 101 + 101 + 101 + • • • = 101 X 50 = 5050

 

여기에서 착안하여 수학에서는 이런 계산법을 등차수열이라고 합니다. 등차가 1인 등차수열의 합으로 정의합니다. 1부터 사용자가 입력한 수까지 단순무식하게 기계적으로 일단 더해보겠습니다. 항상 강조하는 바이지만 자연수의 덧셈이니 사용자가 문자나 실수를 입력하지 못하도록 하는 것부터 시작하겠습니다.

 

while True:
    try:
        input_number = int(input("\n1보다 큰 자연수를입력하세요 : "))
        if input_number == 1:
            print("\n1을 입력하셨습니다. 합계는 1입니다.")
            continue
        elif input_number <= 0:
            print("\n1보다 작은 수를 입력하셨습니다. 다시입력해주세요.")
            continue
        else:
            break
    except:
        print("\n")
        print("잘 좀 입력해주시죠. :(")
        continue

 

프로그램 개발자들이 장난스럽게 만들어 숨겨둔 것을 이스터 에그 (easter egg)라고 합니다. 부활절에 달걀을 가지고 장난을 친 것에서 유래되었다고 하는데, 일에 피곤하고 지친 개발자들이 장난을 치면서 스트레스를 풀곤 하는데 저도 자주 장난을 칩니다.

 

먼저 사용자가 숫자가 아닌 문자를 입력하거나 자연수가 아닌 소수점을 가진 실수를 입력하거나 하면 다시 입력할 것을 요구합니다. 그리고 만약 1을 입력하면 1부터 1까지 합계를 구하는 것이니 당연히 합은 1이라고 알려주고 다시 입력할 것을 요구합니다. 그런데 만약 0이나 마이너스 값을 입력하면 역시 다시 입력할 것을 요구합니다. 다시 요구할 때 장난스럽게 욕을 하거나 해도 상관 없습니다. 어차피 내가 만든 프로그램이니까요. 저는 그냥 여기서는 귀엽게 마무리했습니다.

 

1보다 큰 자연수를 입력하세요 : 2.5

잘 좀 입력해주시죠. :(

 

1보다 큰 자연수를 입력하세요 : 0

1보다 작은 수를 입력하셨습니다. 다시 입력해주세요.

 

1보다 큰 자연수를 입력하세요 :

 

이제 입력한 숫자가 1보다 큰 자연수인 것이 확실하므로 1부터 순차적으로 더해 주기만 하면 됩니다. 이럴 때는 while 구문이 편리합니다. 변수 n을 정의하여 입력한 숫자가 될 때까지 더해보겠습니다.

 

n = 1
sum = 0
while n <= input_number:
    sum = sum + n #또는 sum+=n
    n = n + 1 #또는 n+=1

print("\n")
print('1부터 {0}까지 합계는 {1}입니다'.format(input_number,sum))

 

1보다 큰 자연수를 입력하세요 : 10

1부터 10까지 합계는 55 입니다.

 

숫자를 거꾸로 더하는 것도 해보겠습니다다양한 환경에서 사용할 줄 알아야 하기 때문에 이것저것 재미로 해보는 습관도 중요합니다입력한 숫자부터 1까지 더해보겠습니다.

 

n = input_number
sum = 0
while n >= 1:
    sum = sum + n #또는 sum+=n
    n = n - 1 #또는 n-=1

print("\n")
print('1부터 {0}까지 합계는 {1}입니다.'.format(input_number,sum))

 

1보다 큰 자연수를 입력하세요 : 10

1부터 10까지 합계는 55 입니다.

 

거꾸로 더하든, 똑바로 더하든 상관없이 결과 값이 같다는 것을 확인할 수 있습니다.

 

여기에서 좀 더 나아가서 수학적으로 풀어보겠습니다. 앞에서 봤던 식을 다시 가져와 보겠습니다.

1 + 2 + 3 + • • • + 98 + 99 + 100 = 101 + 101 + 101 + • • • = 101 X 50 = 5050

 

위 식을 한 번 더 겹쳐서 쓰되 반대로 적어보겠습니다.

1 + 2 + 3 + • • • + 98 + 99 + 100

100 + 99 + 98 + • • • + 3 + 2 + 1

 

위 두 식을 더하면 이렇게 될 것입니다.

101 + 101 + 101 + • • • = 101 X 100 = 10100 / 2 = 5050

 

101이 100개가 있으니 합계는 10100이 될 것입니다.그런데 합계를 두 번 더했으니 2로 나눠주면 5050이라는 결과 값을 얻을 수 있습니다. 결국 무슨 얘기냐면, 1부터 n까지 더하라고 했을 때, n과 1을 더한 값이 n개 있으니 곱한 뒤 2로 나눠주면 된다는 의미입니다. 그래서 등차수열의 합계는 아래 공식에서 구할 수 있습니다.

합계 = {n X (n+1)} / 2

 

이 공식만 알면 파이썬의 코딩 내용은 아래와 같이 적용할 수 있습니다.

sum = int(input_number * (input_number + 1) / 2)

print("\n")
print('1부터 {0}까지 합계는 {1}입니다.'.format(input_number,sum))

 

반응형

 

이와 같이 방법은 한 가지가 아닙니다. 알면 알수록 간결하게 코딩의 양을 줄일 수 있고 지름길을 찾아갈 수도 있습니다. 그렇다고 단순무식하게 더했다고 누구도 틀렸다고 말할 수 없습니다. 개발자의 취향이나 선호도의 차이일 뿐이고, 계산 속도에 크게 차이가 나지 않는다면 전혀 문제가 될 것이 없습니다.

 

완성된 구문의 모습은 다음과 같습니다.

 

#case1----------------------------------------------------
#사용자가 자연수만 입력하도록 무한반복 구문 사용
while True:
    try:
        input_number = int(input("\n1보다 큰 자연수를입력하세요 : "))
        if input_number == 1:
            print("\n1을 입력하셨습니다. 합계는 1입니다.")
            continue
        elif input_number <= 0:
            print("\n1보다 작은 수를 입력하셨습니다. 다시입력해주세요.")
            continue
        else:
            break
    except:
        print("\n")
        print("잘 좀 입력해주시죠. :(")
        continue

n = 1
sum = 0
while n <= input_number:
    sum = sum + n #또는 sum+=n
    n = n + 1 #또는 n+=1

print("\n")
print('1부터 {0}까지 합계는 {1}입니다.'.format(input_number,sum))

#case2----------------------------------------------------
#사용자가 자연수만 입력하도록 무한반복 구문 사용
while True:
    try:
        input_number = int(input("\n1보다 큰 자연수를입력하세요 : "))
        if input_number == 1:
            print("\n1을 입력하셨습니다. 합계는 1입니다.")
            continue
        elif input_number <= 0:
            print("\n1보다 작은 수를 입력하셨습니다. 다시입력해주세요.")
            continue
        else:
            break
    except:
        print("\n")
        print("잘 좀 입력해주시죠. :(")
        continue

n = input_number
sum = 0
while n >= 1:
    sum = sum + n #또는 sum+=n
    n = n - 1 #또는 n-=1
 
print("\n")
print('1부터 {0}까지 합계는 {1}입니다.'.format(input_number,sum))

#case3----------------------------------------------------
#사용자가 자연수만 입력하도록 무한반복 구문 사용
while True:
    try:
        input_number = int(input("\n1보다 큰 자연수를입력하세요 : "))
        if input_number == 1:
            print("\n1을 입력하셨습니다. 합계는 1입니다.")
            continue
        elif input_number <= 0:
            print("\n1보다 작은 수를 입력하셨습니다. 다시입력해주세요.")
            continue
        else:
            break
    except:
        print("\n")
        print("잘 좀 입력해주시죠. :(")
        continue

sum = int(input_number * (input_number + 1) / 2)

print("\n")
print('1부터 {0}까지 합계는 {1}입니다.'.format(input_number,sum))

 

제가 만든 것이 정답은 아닙니다. 저는 정답이라고 글을 쓰거나 자랑하려고 올리는 것이 아닙니다. 저는 부족한 것 투성이임을 누구보다 잘 알고 있습니다. 그래서 공부를 놓지 못하고 계속하는 것입니다. 반복해서 말씀 드리지만, 저도 처음 공부 시작할 때 누군가에게 도움을 받았으니, 저도 누군가에게 도움을 드리고자 할 뿐입니다. 시작할 때의 그 막막함과 답답함을 저는 너무 잘 알고 있으니까요.

 

끝으로…

 

프로그램 언어 공부는 이렇게 갑자기 만들고 싶은 것이 있어야 실력이 향상됩니다. 함수를 잔뜩 외운다고 늘지 않습니다. 직접 프로그램을 만들어 보고, 책이나 인터넷에서 남이 만든 코딩을 영어 해석하듯이 해석해보고, 때론 응용도 하면서 씹고, 뜯고, 맛보고, 즐기고 해야 합니다. 저도 그랬습니다. 

 

세상 모든 것이 그러하듯이, 코딩도 꾸준히 하다 보면 실력이 늡니다.

 

 

728x90
반응형

관련글 더보기

댓글 영역