programming

Hackerrank 알고리즘 퀴즈 extra long factorials 파이썬 풀이 및 해설


by Kitle · 2020. 08. 07.



Hackerrank 알고리즘 퀴즈 extra long factorials를 python 으로 풀어보겠습니다.

출처 : goto extra-long-factorials problem

깃허브 풀이 소스 보기 : 깃허브 이동

문제요약: 이번 문제는 팩토리얼 결과가 큰 수가 나오는 경우 이 부분을 처리할 수 있는지, 즉 큰 수를 다루는 것을 할 수 있는지 물어보는 퀴즈입니다. 팩토리얼은 잘 아시다시피 n = 5라면 5 * n-1 * n-2 ... * 1 의 결과입니다. 보통 5!로 기술하죠. 1!의 결과는 1입니다. 

[부가 설명]

python은 사실 그동안 int 인지 long 인지 크게 신경을 쓰지 않았던 것 같습니다. 그래서 이번 문제를 통해 스터디도 같이 하게 되었네요. python에서 long() 은 있을까요?

python3에서는 없습니다. 왜 일까요. 일단 풀이 보고 해설과 같이 기술하도록 하겠습니다.

[풀이]

#!/bin/python3

import math
import os
import random
import re
import sys

# Complete the extraLongFactorials function below.
def extraLongFactorials(n):
if n > 1:
return n * extraLongFactorials(n-1)
else:
return 1


if __name__ == '__main__':
n = int(input())
print(extraLongFactorials(n))
[해설]
여러 풀이 방법이 있겠지만 팩토리얼 풀이의 정석(?)인 재귀함수로 풀겠습니다. return을 자기 자신에게 다시 보내는 방식이죠. 학교 다닐땐 이게 그렇게 이해가 잘 안가고 어려웠었던것 같은데.. 지금은 음 그냥 그러려니 합니다.
어쨌든 기본 코드로 돌리고 최종 리턴을 출력하면 결과가 잘 나옵니다. 과연 해커랭크에서는 모든 케이스를 통과할까요?
통과입니다.
매우 싱겁게 끝나버렸네요. 큰수에 대한 처리가 따로 파이썬에서는 필요하지 않나 봅니다. 왜그런지 한번 알아볼까요.

문제의 상세 설명에 보시면 다음과 같은 문구가 있습니다.

Languages like Java, Python, Ruby etc. can handle big integers, but we need to write additional code in C/C++ to handle huge values.
python의 경우는 큰 interger를 다룰 수 있다고 합니다. 따라서 특별한 작업이 필요 없는것 같네요. 그리고 좀 더 찾아본 결과 in Python 3의 int는 크기에 제한이 없습니다. Python 2에는 int와 long의 두 가지 정수 유형이 있습니다. 파이썬 3에는 더 이상 '긴 정수'가 없습니다. 라고 합니다.
역시 파이썬스럽게 빠른 코딩에는 최고인 것 같네요. 각 언어들은 장단점이 있지만 이부분만큼은 파이썬의 강점인 것 같습니다.

아 그리고 더 줄이고 싶으신 분들은 코드를 더 줄일 수 있습니다.
파이썬 삼항 연산자를 사용하면 됩니다.

        return n * extraLongFactorials(n-1) if n > 1 else 1
로 변경하시면 됩니다.  if 앞에는 if가 참일때 수행, else 는 거짓일 때 수행입니다. 정말 간단하죠?