[백준/JAVA] 1676번 팩토리얼 0의 개수

정은아·2024년 3월 1일

[알고리즘] 수학 모음

목록 보기
41/152
post-thumbnail

문제

내 풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;

public class Main extends Exception {
    public static void main(String[] args) throws IOException {

        // N!을 계산했을 때, 뒤에 0이 몇 개 있느냐?
        // ex. 10! = 3,628,800 == 뒤에서부터 0이 2개 있음 == 답 2개

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        int num = Integer.parseInt(br.readLine());
        // num의 Factorial 값을 구할 변수
        BigInteger numFac = BigInteger.valueOf(1);
        // 0이 몇 개인지 세줄 변수
        int count = 0;

        // Factorial 값을 구한다.
        for (int i = 1; i <= num; i++) {
            numFac = numFac.multiply(BigInteger.valueOf(i));
        }

        // 10씩 나눠주면서 0이 몇 개인지 세준다.
        while(true){
            if (numFac.remainder(BigInteger.valueOf(10)) != BigInteger.ZERO){
                break;
            }else{
                numFac = numFac.divide(BigInteger.valueOf(10));
                count++;
            }
        }

        sb.append(count);
        System.out.println(sb.toString());
    }
}

느낀점

Factorial 문제는 값이 어마어마하게 커지기 때문에 거의 모든 경우에 Biginteger를 써야한다. Biginteger는 단순연산도 모두 메서드를 써야해서 주의가 필요하다.
첫 for문으로 Factorial 값을 구한뒤, while문을 돌려 맨 뒤에서부터 10씩 나눠주면서 0의 갯수를 세어주면 됐다. 이 문제는 문제 이해하는게 제일 어려웠다.

profile
꾸준함의 가치를 믿는 개발자

0개의 댓글