문제
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500)
출력
첫째 줄에 구한 0의 개수를 출력한다.
예제 입력 1
10
예제 출력 1
2
예제 입력 2
3
예제 출력 2
0
처음에 어떤 의미의 문제인가 이해를 하지 못했다.
그러다 계산기로 10!을 쳐보고 이해를 했다.
5!=120
10!=3,628,800
즉 뒤에 있는 0의 갯수를 말하는 것이였다.
10!은 5의 배수인 5와 10이 두개이므로 0이 2개가 나온다.
15!는 5,10,15 3개이므로 0이 3개가 나온다.
그렇기에 5만 나올때마다 cnt+=1해주면 될줄 알았다....
n=int(input())
cnt=0
for i in range(0,n+1,5):
if i==0:
continue
cnt+=1
print(cnt)
하지만 문제가 있었다....
5,25,125가 5의 배수 카운트보다 더 0은 증가했다.
25!=15,511,210,043,330,985,984,000,000
이처럼 0이 6개가 왔다ㅜㅜㅜ
이 원리를 검색해 보면 이렇다..
25는 5x5로 5를 두개 가지고 있다. 그렇기에 25의 배수는 5를 한번더 카운트해줘야한다.
즉 25,50,75,100이 될때매다 5가 하나씩 더 늘어난다. == 0이 하나씩 더 늘어난다는 소리이다.
그런 100!은
5일 때, 0이 5,10,15,20~100 까지 총 20개
25일 때, 25,50,75,100 까지 4개
합쳐서 총 24개의 0이 생긴다.
그럼 이와 같이 125는 5x5x5로 5가 3개이므로, 125, 250, 375, 500 일 때도 5를 하나씩 추가해줘야한다는 소리이다.
예를 들어 500!일 경우
5일 때, 5,10,15~~~500까지 100개
25일 때, 25,50,~~500까지 20개
125일 때, 125,250,375,500까지 4개
총 124개의 0이 있다.
n=int(input())
cnt=0
while n>0:
cnt+=n//5
n//=5
print(cnt)
코드를 짜면 이와 같다.
또한 다른 분의 코드를 보니 딱 2줄로 끝낸 것이 있었다.
https://hwiyong.tistory.com/360
N = int(input())
print(N//5 + N//25 + N//125)
답을 보면 이해를 하겠지만 막상 내가 풀자니 이런 조건들을 찾아낼 수 있을지 의문이다.
여담으로 n!을 구하는 라이브러리 또한 있다.
from math import factorial
n=5
result=factorial(n)
print(result)
# 결과 : 120
'알고리즘 > 함수 in python' 카테고리의 다른 글
stack, queue, deque in python (0) | 2021.11.12 |
---|---|
[백준 3036번] (Fraction)분수 표현 in python (0) | 2021.11.10 |
[백준 11053번] (bisect)가장 긴 증가하는 부분 수열(LIS) in python (0) | 2021.11.08 |
from itertools import 순열, 조합, 곱집합, 중복조합 in python (0) | 2021.11.02 |
[백준 2108번] (Counter)통계학(평균, 중앙값, 최빈값, 범위) in python (0) | 2021.11.01 |
댓글