
문제를 살펴보면 N!을 구한 후에 뒤에서부터 0의 개수가 몇개인지 확인하면 된다
예제를 살펴보면 10! 은 3628800이기 때문에 2가 나오고, 3!은 6이기 때문에 0이 정답이다
팩토리얼 값을 구하는 함수를 재귀적으로 호출하는 방식으로 하나 만들어주고,
리스트를 하나 만들어서 뒷자리부터 차례대로 숫자를 하나씩 저장한다
이후에 리스트를 확인하며 0인 경우 cnt += 1을 해주고 아니라면 종료하면 된다
def factorial(num):
if num > 1:
return num * factorial(num - 1)
else:
return 1
N = int(input())
result = factorial(N)
digit = []
while result > 0: # 뒷자리부터 digit리스트에 저장
num = result % 10
digit.append(num)
result //= 10
cnt = 0
i = 0
while digit[i] == 0:
i += 1
cnt += 1
print(cnt)
해당 코드를 제출하면 정답임을 확인할 수 있지만, 다른 분들의 코드의 길이가 상당히 짧았다
(물론 위의 코드보다 더 짧게 while문 하나로도 해결이 가능하다)
그래서 어떠한 비밀이 숨겨져있는지 확인해보니 수학적인 원리를 이용하면 훨씬 간단한 문제였다
결국 뒷자리가 0이라는 뜻은 2 * 5 가 포함되어있기때문에 가능한 숫자이다
이를 활용하면 팩토리얼보다 작은 5의 개수를 구하면 된다
제곱수도 생각을 해주어야하기 때문에 이를 반영하여 코드를 두 줄로 간단하게 작성하면
N = int(input())
print(N//5 + N//25 + N//125)
이렇게 된다 수학적 원리를 이용하면 두 줄로도 해결이 가능한 문제이다

'Baekjoon' 카테고리의 다른 글
| [Baekjoon]백준 2447 별 찍기 - 10(골드 5) - Python (1) | 2024.12.21 |
|---|---|
| [Baekjoon]백준 4779 칸토어 집합(실버 3) - Python (1) | 2024.12.20 |
| [Baekjoon]백준 2609 최대공약수와 최소공배수(브론즈 1) - Python (0) | 2024.12.18 |
| [Baekjoon]백준 24060 알고리즘 수업 - 병합 정렬 1(실버 3) - Python (0) | 2024.12.17 |
| [Baekjoon]백준 2577 숫자의 개수(브론즈 2) - Python (0) | 2024.12.16 |