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

김경욱·2025년 8월 28일

백준

목록 보기
67/121

틀린 코드
:

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

import java.util.*;

public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int N = Integer.parseInt(br.readLine());

    if (N <=3)
    {
        System.out.println(0);
        return;
    }
    double fac = 1;

    for (int i = 1; i <= N; i++)
    {
        fac *= i;
    }

    String fac2 = String.valueOf(fac);


    char[] num = new char[fac2.length()];

    double[] num2 = new double[fac2.length()];


    for (int i = 0 ; i < fac2.length(); i++)
    {
        num[i] = fac2.charAt(i);
        num2[i] = (double) num[i]-'0';
    }



    boolean[] last_num = new boolean[fac2.length()+1];

// 10 팩토리얼 -> 3628800

    for (int i =0; i < fac2.length(); i++)
    {
        if(num2[i] == 0)
        {
            last_num[i] = false;


        }

        if (num2[i] != 0)
        {
            last_num[i] = true;
        }
    }







    for (int i = fac2.length()-1; i >=0; i--)
    {
        if(last_num[i])
        {
            System.out.println(fac2.length()-1-i);
            return;
        }
    }

    // 5!   -> 120
















}

}

너무 복잡하고 큰 수일겨우에는 값의 오류가 발생하여 틀린 코드이다.
숫자 마지막에 0이 몇개 들어갈려는 지 알려면 5의 제곱수를 이용하여 구하면 된다.

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

import java.util.*;

public class Main {
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    int N = Integer.parseInt(br.readLine());

   int count = 0;

    for (int i = 5; i <= N; i *= 5)
    {
        count += N/i;
    }

    System.out.println(count);








}

} 이렇게 간단하게 풀리는 지 놀랐고, 50팩토리얼 같이 값이 크게 나올경우엔 일일이 풀이과정을 따라 가는 것보단 이렇게 한번에 직관적으로 식을 정립하여 구하는 것이 맞는 것 같다는 생각을 하게 되었다.

0개의 댓글