728x90
시간 제한 : 2초
메모리 제한 : 128MB
문제
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (0 ≤ N ≤ 500)
출력
첫째 줄에 구한 0의 개수를 출력한다.
소스코드
#include <iostream> using namespace std; int main(void) { int dp[501], n; cin >> n; for (int i = 0; i <= 4; i++) dp[i] = 0; for (int i = 5; i <= n; i++) { if (i % 5 == 0) { int cnt = 0, k; k = i; while (k > 4) { if (k % 5 == 0) k /= 5, cnt++; else break; } dp[i] = dp[i - 1] + cnt; } else { dp[i] = dp[i - 1]; } } cout << dp[n]; return 0; }
Tip
이항 계수를 응용해 푸는 문제였지만 나는 DP를 바탕으로 문제를 풀었다.
이항 계수를 이용하면 더 쉽게 풀리는 문제인 듯 한데... 그냥 수학적으로 다른 거 보지 않고 어떤 경우에 0이 늘어나는지만 분석하고 문제를 접근했다.
728x90
'Computer Science > Algorithm Problem' 카테고리의 다른 글
백준 알고리즘] 11727 - 2xn 타일링 2 (0) | 2017.11.20 |
---|---|
백준 알고리즘] 5567 - 결혼식(JOI 2010 예선 3번) (0) | 2017.11.18 |
백준 알고리즘] 11399 - ATM (0) | 2017.11.15 |
백준 알고리즘] 10250 - ACM 호텔(ACM-ICPC 2014 인터넷 예선) (0) | 2017.11.14 |
백준 알고리즘] 9012 - 괄호(ACM-ICPC 2012 인터넷 예선) (0) | 2017.11.13 |