개인활동/코테

백준 27433번 : 팩토리얼2

려우 2025. 1. 7. 11:13
반응형

다시 시작하는 코테 풀이

재귀함수부터 다시 시작해본다

이 문제에서 유의할 점은 아래와 같은 에러가 뜨거나 시간 초과가 뜰 수 있다는 점

각각의 원인을 살펴보면 아래의 내용과 같다.

1. 런타임 에러 : Recursion Error

공홈에서는 해당 에러를 "Python이 정한 최대 재귀 깊이보다 재귀의 깊이가 더 깊어질 때" 발생한다고 정의하였다.

해결 방안은 재귀함수를 사용하지 않거나 최대 재귀 깊이를 더 크게 만들어주는 것

 

재귀함수 문제에서 재귀함수를 사용하지 않을 수 없으니 최대 재귀 깊이를 크게 만들어주는 것으로 해결한다.

import sys
sys.setrecursionlimit(10**6)

def factorial(n):
...

 

2. 시간 초과

이건 나의 정말 어이없는 실수였다.

...
def factorial(n):
  if n == 1:
    return n
...

어...

뭘까 이건?

 

n이 1이 들어온 경우까지는 해결이 되겠지만, n이 0이 들어온다면?

무한히 음수로 내려가다보니 당연히 시간 초과가 뜰수밖에 없다.

 

따라서 if n == 1: return n이 아니라 if n == 0: return 1로 바꿔줘야 한다


따라서 최종적인 코드는 아래와 같다.

import sys
sys.setrecursionlimit(10**6)

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

n = int(input())
print(factorial(n))

숏코드 분석하기

import math;print(math.perm(int(input())))

 

너무하네요

패키지 가져와서 쓰다니

이럴거면 이런 문제를 만들었겠습니까

 

그러나, 이런 방식이 때로는 현명한 선택일 때도 있을 것이다.

math 패키지에 있는 perm 함수는 팩토리얼을 계산하는 함수로 실제 코드를 가져와본 결과

def perm(n: SupportsIndex, k: SupportsIndex | None = None, /) -> int: ...

 

재귀를 사용하는지 보고싶었는데, 다 보이지 않는 것 같다.

 

여튼 이를 활용하면 더 쉽게 팩토리얼 계산이 가능하다는 점


문제

https://www.acmicpc.net/problem/27433

 

Recursion Error 설명

https://help.acmicpc.net/judge/rte/RecursionError

 

math.perm()

https://docs.python.org/3/library/math.html

 

math — Mathematical functions

This module provides access to the mathematical functions defined by the C standard. These functions cannot be used with complex numbers; use the functions of the same name from the cmath module if...

docs.python.org

 

 

반응형