728x90
풀이
nCm(조합)에서 끝자리 0의 개수를 구하면 된다.
조합 공식은 n! / m! (n-m)! 이다.
만약 저 조합의 값을 구하고 0을 구하려고 한다면
원하는 답이 나오지도 않을 뿐 더러 시간 초과 걸릴 것이다.
위 값을 구하려고 한다면 Number 범위를 넘어버린다.
그렇기 때문에 각 팩토리얼 당 0의 개수를 구해서 더하고 빼주면 된다.
0의 개수를 구하기 위해서는 소인수 분해해서 5의 개수와 2의 개수를 알아야한다.
팩토리얼은 2의 개수가 항상 5보다 많거나 적기 때문에 5의 개수만 구하면 됐지만,
조합은 알 수 없기 때문에 2와 5를 모두 구해야 한다.
n! / m! (n-m)!이기 때문에
n!의 2와 5의 개수를 구하고
그 값에서
m!의 2와 5의 개수를 빼고
(n-m)!의 2와 5의 개수를 빼주면 된다.
팩토리얼에서 5혹은 2의 개수를 구하는 방법은
const getTwoFive = (n) => {
const two = 0;
const five = 0;
for (let i = 5; i <= n; i*=5) {
five += parseInt(n / i);
}
for (let i = 2; i <= n; i*=2) {
two += parseInt(n / i);
}
return [two, five]
}
위 루프문에 대한 설명은 아래 게시물 참고
그리고 조합 공식에서 분자의 값에서 분모의 값들을 빼주고,
2의 배수의 개수와 5의 배수의 개수를 구한 값 중 작은 값을 출력하면 된다.
전체 코드
반응형
'개발👩💻 > 알고리즘' 카테고리의 다른 글
백준 js 17087: 숨바꼭질 6 (0) | 2021.05.07 |
---|---|
백준 js 6913: GCD 합 (0) | 2021.05.07 |
백준 js 1676: 팩토리얼 0의 개수 (0) | 2021.05.06 |
백준 js 10872: 팩토리얼 (0) | 2021.05.06 |
백준 js 6588: 골드바흐의 추측 (0) | 2021.05.05 |