문제 풀이/백준

[백준] 2553번. 마지막 팩토리얼 수(JAVA)

27200 2025. 2. 3. 15:39

문제

https://www.acmicpc.net/problem/2553


풀이(35분)

import java.io.*;

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[] dp = new int[20001]; // 초기 배열 값을 위한 20001 초기화

        dp[1] = 1;
        dp[2] = 2;
        dp[3] = 6;
        dp[4] = 4; // 2의 제곱수까지의 값 저장

        int temp = 0;
        for (int i = 5; i <= n; i++) {
            if (i % 5 == 0) {
                temp = i / 5;
                dp[i] = (dp[temp] * (int) Math.pow(2, temp % 4)) % 10;
            } else {
                temp = (i / 5) * 5;
                dp[i] = dp[temp];
                for (int j = temp + 1; j <= i; j++) {
                    dp[i] = dp[i] * j % 10;
                }
            }
        }

        System.out.println(dp[n]);
    }
}

 

생각보다 복잡한 풀이를 했던 것 같다.

문제 풀이 초반 마지막 자릿수들만을 추적하며 지속적으로 값을 곱해나가면 되는 문제인줄 알았다.

 

예를 들면 이런 식이었다.

1은 1
2는 2
3은 6
4는 4
5는 2
6은 2
7은 4
8은 2
9는 8
10은 8
11은 8
12는 6
13은 8

하지만 계산을 해본 결과 25에서 4가 나와야 하는 것이 3이 나오는 오류가 있었다.

 

따라서, 처음에 문제 풀이를 생각한 대로 2와 5의 개수를 찾아 제거해주는 방식으로 진행하였다.