본문 바로가기
Algorithm/Python

백준 1676번 팩토리얼 0의 개수

by Shark_상어 2023. 1. 8.
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