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
'Problem Solving > BOJ' 카테고리의 다른 글
[백준, BOJ 2805] 나무 자르기 (java) (0) | 2024.09.03 |
---|---|
[백준, BOJ 12605] 단어순서 뒤집기 (java) (0) | 2024.09.01 |
[백준, BOJ 7795] 먹을 것인가 먹힐 것인가 (java) (0) | 2024.08.31 |
[백준, BOJ 10773] 제로 (java) (0) | 2024.08.30 |
[백준, BOJ 2607] 비슷한 단어 (java) (0) | 2024.08.30 |