[백준, BOJ 27434] 팩토리얼 3 (java)
Problem Solving/BOJ

[백준, BOJ 27434] 팩토리얼 3 (java)

728x90

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

메모리: 393,188 KB , 시간: 2,960 ms

사용 알고리즘: 큰 수 연산, 사칙연산, 수학

728x90

Java에서는 long 타입으로도 오버 플로우가 발생하기 때문에, 기본 자료형을 사용할 수 없다.

때문에 BigInteger라는 것을 사용해야 한다.

 

BigInteger에서 곱셈 연산을 하기 위해서는 BigInteger 객체의 multiply라는 메소드를 사용해야 하고,

이 메소드는 파라미터로 곱하고자 하는 수를 나타내는 BigInteger 객체를 받는다.

 

때문에 $N!$을 계산하기 위해 N번의 BigInteger 객체를 생성하고 곱하는 과정에서 시간초과가 난다.

시간초과를 해결하기 위해서는 BigInteger 생성 횟수를 줄여야 하고,

분할 정복을 사용하여 이를 해결하였다.

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

public class Main {

    public static void main(String[] args) throws Exception{

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

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

        if(N == 0) {
            System.out.println(1);
            return;
        }

        System.out.println(factorial(1, N));
    }

    private static BigInteger factorial(int start, int end) {

        if(start == end) return BigInteger.valueOf(end);

        // BigInteger 객체 생성 횟수를 줄이기 위해 분할 정복 사용
        return factorial(start, (start + end) / 2).multiply(factorial((start + end) / 2 + 1, end));
    }
}
728x90