[Baekjoon] 1676번 : 팩토리얼 0 의 갯수 - Silver 5
1. 문제에 대한 접근 및 이해
사용자의 입력 값 N 에 대하여 N! 계산을 진행 한 후, 그 값에 대해서 첫째 자리(문제에서는 맨 뒤를 의미)에서 부터 0이 아닌 다른 수가 나오기 까지 0의 갯수를 구해야 한다. ( 1의 자리 부터 0의 갯수를 센다, 10의 자리, 100의 자리를 세서 0이 아닌 자릿수가 나오면 그 이전에 나온 0의 갯수를 구한다.)
ex) 10! 의 값은 3,628,800 이다.
1의 자리는 0, 10의 자리는 0, 100의 자리는 8이다. 문제에서 뒤에서부터 처음 0 이 아닌 숫자가 나올때까지 0의 갯수를 구하라고 했으므로, 8이 나오기 전의 0의 갯수는 2 개 이다.
ex2) 55! 의 값은 12,696,403,353,658,275,925,965,100,847,566,516,959,580,321,051,449,436,762,275,840,000,000,000,000 이다.
1의 자리는 0, 10의 자리는 0.... 이다. 문제에서 뒤에서부터 처음 0 이 아닌 숫자가 나올때까지 0의 갯수를 구하라고 했으므로, 4가 나오기 전의 0의 갯수는 13 개 이다.
2. 구현 방법 계획
- 사용자의 입력값 N을 받고, 반복문을 통해 N! 값을 구해낸다. (N! 의 값을 targetNum 변수로 저장한다)
- targetNum 은 정수형이므로 0의 갯수를 구할 수 없기 때문에, 문자열로 형 변환을 해준다
- targetNum 의 마지막 자리수(1의 자리) 부터 조건문으로 '0'(문자) 인지 아닌지 체크한다. '0' 이 맞다면 count 를 1씩 더해주고 '0'이 아니라면 count 를 계산하지 않고, 불필요한 계산을 더 하지 않기 위해 반복문도 종료 해준다.
3. 파이썬 구현
import sys
N = int(sys.stdin.readline().strip())
sum = 1
for i in range(1,N+1):
sum *= i
targetNum = str(sum)
count = 0
for i in range(len(targetNum)-1,-1,-1):
if '0' == targetNum[i]:
count += 1
else:
break
print(count)
4.제출 결과
* 처음에 틀린 이유
문제를 잘 이해하지 못하고 targetNum 전체에서 0의 갯수를 반환하도록 코드를 작성했다. 문제를 다시 잘 읽어보니, 1의 자리 수 부터 0이 아닌 수가 나올때까지 0의 갯수를 카운트 해야 한 다는 것을 알았고, 1의 자리수는 인덱스로 len(targetNum)-1 으로 표현 할 수 있으니, 이 인덱스 부터 반복문을 시작하여 0의 갯수를 카운트 하고, 0이 아닐때 계산 및 반복문을 종료 하도록 구현 하였다.