Computer Science/Algorithm Problem

백준 알고리즘] 1676 - 팩토리얼 0의 개수

TwinParadox 2017. 11. 16. 22:20
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