상세 컨텐츠

본문 제목

[Python] 숫자의 팩토리얼 값 구하기 파이썬 프로그램 예제

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

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

본문

반응형

 

이번에는 자연수의 팩토리얼 (factorial)을 구해보겠습니다. 팩토리얼은 느낌표 !로 표시하며, 1부터 해당 숫자까지 모두 곱하는 기본 수학 개념 중 하나입니다. 가령 3!은 1 X 2 X 3 = 6입니다. 그리고 많은 분들이 배웠지만 까먹었을 중요한 개념은 0의 팩토리얼은 1이라는 것입니다. (0! = 1) 학창시절 공부하던 수학책이 있다면 한 번 찾아보세요. 분명히 나와 있습니다. 어쨌든 0을 제외하면 팩토리얼은 양의 정수, 즉 자연수만 적용 가능한 개념입니다.

 

지난 시간에 숫자 1부터 n까지 더하는 방법을 공부했으므로 이제는 곱하기만 하면 되니 쉽습니다. 하지만 매번 똑같이 하면 재미 없으므로 몇 가지 스킬을 더 공부해보겠습니다. 일단 시작은 항상 그렇듯이 사용자가 잘못 입력하는 것을 방지하기 위한 구문부터 시작하겠습니다.

 

#사용자가 자연수만 입력하도록 무한반복 구문 사용
while True:
    try:
        input_number = int(input("\n1보다 큰 자연수를 입력하세요 : "))
        if input_number == 1:
            print("\n1!은 1입니다.")
            continue
        elif input_number == 0:
            print("\n0!은 1입니다.")
            continue
        elif input_number < 0:
            print("\n음수의 팩토리얼은 계산이 불가능합니다.")
            continue
        else:
            break
    except:
        print("\n잘 좀 입력해주시죠. :(")
        continue

 

사용자가 숫자가 아닌 문자, 소수점을 가진 실수, 음의 정수를 입력하면 다시 입력해야 합니다. 그리고 1을 입력하거나 0을 입력하면 곧바로 결과 값을 출력하고 다시 입력할 것을 요구합니다. 만약 1과 0의 값만 확인하고 프로그램을 여기서 끝내고 싶다면 continue 대신 exit()를 사용하면 됩니다. 아예 프로그램을 여기서 종료시켜버리면 되는 것입니다.

 

다음은 사용자가 입력한 자연수까지 1부터 순차적으로 곱해주기만 하면 됩니다. 첫번째는 오름차순으로 곱해보겠습니다.

 

n = 1
fact_num = 1

while n <= input_number:
    fact_num = fact_num * n
    n = n + 1 #또는 n+=1

print('\n{0}! = {1} 입니다.'.format(input_number,fact_num))

 

while 구문을 사용하여 n이 사용자가 입력한 값보다 커지기 전까지 계속 곱해줍니다.

 

다음은 내림차순으로 곱해보겠습니다. n이 1이 될 때까지 곱해줍니다.

 

n = input_number
fact_num = 1

while n >= 1:
    fact_num = fact_num * n
    n = n - 1 #또는 n-=1

print('\n{0}! = {1} 입니다.'.format(input_number,fact_num))

 

반복 구문에는 while만 있는 것이 아닌데 왜 계속 while만 쓰냐고 할 수 있습니다개인적인 취향일 뿐이고 특별한 이유는 없습니다같은 상황에서 for 구문은 어떻게 사용하는지 살펴보겠습니다.

 

fact_num = 1

for i in range(1, input_number + 1):
    fact_num = fact_num * i

print('\n{0}! = {1} 입니다.'.format(input_number,fact_num))

 

분명 for 구문이 while 구문보다 간결한 것은 사실입니다. 본인이 더 편하다고 생각하는 방법을 사용하면 될 것 같습니다.

 

반응형

 

또 한가지 방법이 더 있습니다. 프로그램 내에서 새롭게 함수를 정의하는 방법입니다. def를 사용하면 되는데 파이썬 뿐만 아니라 모든 프로그램 언어에서 유용하게 사용되는 방법입니다. 여기서 사용되는 def 함수 정의 방법을 잘 이해해 두시면 두고두고 도움이 되실 것입니다.

 

def factorial(a):
    if a == 1:
        return 1
    else:
        return (a * factorial(a-1))

fact_num = factorial(input_number)
print('\n{0}! = {1} 입니다.'.format(input_number,fact_num))

 

어떠신가요? 함수만 잘 정의하면 코딩은 한 줄로 끝납니다. 그런데 독특한 것은 함수 정의 내에서 본인 함수를 호출한다는 점입니다. 어떤 방식으로 가능한 것인지 이해하셔야만 합니다. 정의된 함수의 내용은 숫자를 입력 받은 후 입력값이 1이면 1을 출력하고, 아니면 입력값과 입력값을 정의된 함수에 다시 집어 넣은 결과 값을 곱합니다. 무슨 말인지 모르시겠죠? 저도 처음에는 그랬습니다. 처음 접하신 분들은 이해 못하시는 것이 지극히 정상이십니다.

 

차근차근 설명 드리겠습니다. 숫자 5로 예를 들어 슬로우 비디오로 천천히 살펴 보겠습니다. 함수 이름을 factorial로 정의하고 입력값 5가 사용자 정의 함수에 입력됩니다. 입력된 5는 1이 아니므로 else 구문의 결과 값으로 직행합니다. 이때 “5 X”까지만 입력되고 1을 뺀 4는 다시 사용자 정의 함수로 입력됩니다. 아직 계산을 못한 것입니다. 4가 입력되면 1이 아니므로 “4 X”가 입력되는데 이전에 입력된 “5 X”에 이어서 입력되므로 “5 X 4 X”라고 입력됩니다. 다시 3이 사용자 정의 함수로 들어가고 “5 X 4 X 3 X”, 2가 입력되어 “5 X 4 X 3 X 2 X”까지 순차적으로 입력됩니다. 아직 계산을 못하고 있습니다. 계산식이 완성되지 못하고 곱하기 기호에서 멈췄기 때문입니다. 이때 드디어 1이 사용자 정의 함수에 입력됩니다. 그러면 if 문에서 1이 입력되면 그냥 1을 출력하기 때문에 “5 X 4 X 3 X 2 X”에 1이 추가되어 “5 X 4 X 3 X 2 X 1”로 드디어 계산이 되는 것입니다. 마지막에 한 번에 계산을 수행하는 원리입니다.

 

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

5! = 120 입니다.

 

최대한 자세히 설명 드린다고 노력했는데 이해가 되셨는지 모르겠습니다. 완성된 구문은 다음과 같습니다.

 

#case1----------------------------------------------------
#사용자가 자연수만 입력하도록 무한반복 구문 사용
while True:
    try:
        input_number = int(input("\n1보다 큰 자연수를 입력하세요 : "))
        if input_number == 1:
            print("\n1!은 1입니다.")
            continue
        elif input_number == 0:
            print("\n0!은 1입니다.")
            continue
        elif input_number < 0:
            print("\n음수의 팩토리얼은 계산이 불가능합니다.")
            continue
        else:
            break
    except:
        print("\n잘 좀 입력해주시죠. :(")
        continue

n = 1
fact_num = 1

while n <= input_number:
    fact_num = fact_num * n
    n = n + 1 #또는 n+=1

print('\n{0}! = {1} 입니다.'.format(input_number,fact_num))


#case2----------------------------------------------------
#사용자가 자연수만 입력하도록 무한반복 구문 사용
while True:
    try:
        input_number = int(input("\n1보다 큰 자연수를 입력하세요 : "))
        if input_number == 1:
            print("\n1!은 1입니다.")
            continue
        elif input_number == 0:
            print("\n0!은 1입니다.")
            continue
        elif input_number < 0:
            print("\n음수의 팩토리얼은 계산이 불가능합니다.")
            continue
        else:
            break
    except:
        print("\n잘 좀 입력해주시죠. :(")
        continue

n = input_number
fact_num = 1

while n >= 1:
    fact_num = fact_num * n
    n = n - 1 #또는 n-=1
 
print('\n{0}! = {1} 입니다.'.format(input_number,fact_num))


#case3----------------------------------------------------
#사용자가 자연수만 입력하도록 무한반복 구문 사용
while True:
    try:
        input_number = int(input("\n1보다 큰 자연수를 입력하세요 : "))
        if input_number == 1:
            print("\n1!은 1입니다.")
            continue
        elif input_number == 0:
            print("\n0!은 1입니다.")
            continue
        elif input_number < 0:
            print("\n음수의 팩토리얼은 계산이 불가능합니다.")
            continue
        else:
            break
    except:
        print("\n잘 좀 입력해주시죠. :(")
        continue

fact_num = 1

for i in range(1, input_number + 1):
    fact_num = fact_num * i

print('\n{0}! = {1} 입니다.'.format(input_number,fact_num))


#case4----------------------------------------------------
#사용자가 자연수만 입력하도록 무한반복 구문 사용
while True:
    try:
        input_number = int(input("\n1보다 큰 자연수를 입력하세요 : "))
        if input_number == 1:
            print("\n1!은 1입니다.")
            continue
        elif input_number == 0:
            print("\n0!은 1입니다.")
            continue
        elif input_number < 0:
            print("\n음수의 팩토리얼은 계산이 불가능합니다.")
            continue
        else:
            break
    except:
        print("\n잘 좀 입력해주시죠. :(")
        continue

def factorial(a):
    if a == 1:
        return 1
    else:
        return (a * factorial(a-1))

fact_num = factorial(input_number)
print('\n{0}! = {1} 입니다.'.format(input_number,fact_num))

 

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

 

끝으로…

 

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

 

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

 

728x90
반응형

관련글 더보기

댓글 영역