728x90
1. 문제 설명
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
- 입력
- 첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500)
- 출력
- 첫째 줄에 구한 0의 개수를 출력한다.
2. 코드
import sys
input = sys.stdin.readline
# n의 범위 중 가장 큰값인 500을 기준으로 값을 저장 할 배열 생성
f = [1] * 501
for i in range(1, 501):
# 반복문을 통해 이전 의 값을 이용하여 팩토리얼을 계산 이후 배열에 저장
f[i] = f[i - 1] * i
# 입력
n = int(input())
# 0의 개수
zero_cnt = 0
# f[n]는 인트형 이므로 str으로 전환후 reverse를 위해 list로 전환
r = list(str(f[n]))
# ex) n = 10 f[n] = 3628800 -> 리버스 이후 0088263으로 바뀜
r.reverse()
for i in r:
# 문제에서 요구한 0의 개수를 카운트 하기위한 if절
if not int(i):
# 0이면 zero_cnt += 1
zero_cnt += 1
else:
# 0이 아니라면 반복문 종료
break
# 출력
print(zero_cnt)
3. 회고
Q. 문제를 보고 든 생각
1. 팩토리얼 값을 저장 할수 있다면 더 빠르지 않을까 라는 생각을 했다.
이를 위해서 n의 범위 값 만큼 배열을 생성해야했고 배열을 이용해서 팩토리얼 값을 저장해뒀다.
2.즉 메모제이션 개념을 활용 했다. 이 개념을 활용하니 Python3으로 제출했음에도 36ms 이 나왔다.
4. 고쳐야 할점
파이썬을 파이썬처럼 풀지 못한 코드이다. 다음에는 조금더 짧은 코드로 리팩토링 해볼것이다.
728x90
'Algorithm > Python' 카테고리의 다른 글
백준 9613번 GCD 합 (0) | 2023.01.08 |
---|---|
백준 17103번 골드바흐 파티션 (0) | 2023.01.08 |
백준 14503번 로봇 청소기 (0) | 2023.01.07 |
백준 4991번 로봇 청소기 (0) | 2023.01.07 |
백준 25307번 시루의 백화점 구경 (0) | 2023.01.05 |