문제

풀이
큰 숫자의 팩토리얼 (n!) 값을 구하는 것으로 기존 int, long, double 등 사용이 불가능하다.
따라서 BigInteger 를 사용해야한다.
BigInteger의 특이한 점은 문자열이라는 점이다.
따라서 자바 내장되어있는 함수를 사용해야한다.
BigInteger big1= new BigInteger("1");
BigInteger big2 = BigInteger.valueOf(2);
이때 두개의 차이점은, big1은 문자열 파싱으로 생성된 것이고,
big2 는 원시타입인 long값을 받아서 생성한 것이다.
이를 활용하여 Type이 BigInteger 끼리 연산은 아래와 같다.
더하기 : big1.add( big2 );
빼기 : big1.subtract( big2 );
곱하기 : big1.multiply( big2 );
나누기 : big1.divide( big2 );
나머지 : big2.remiander( big2 );
이를 응용하여 문제를 풀어보자.
코드
import java.io.*;
import java.math.*;
public class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(System.out);
BigInteger big1 = new BigInteger("1");
int N = Integer.parseInt(br.readLine());
int cnt = 0;
for(int i=2; i<=N; i++){
BigInteger mul = BigInteger.valueOf(i);
big1 = big1.multiply(mul);
}
String str = big1.toString();
for(int i=str.length()-1; i>=0; i--){
int A = (int)str.charAt(i)-'0';
if(0 == A){
cnt++;
}
else{
break;
}
}
pw.print(cnt);
pw.flush();
pw.close();
br.close();
}
}
원시 타입인 long으로 받아 생성하여
for문에서 i값을 이용하였다.
그리고 .multiply를 사용해서 팩토리얼 연산을 완성 시켰다.
그 후 BigInterger를 String 타입으로 변환 시켜 준 후
뒤에서부터 문자를 Int 타입으로 변한 후
0과 비교하여, 성공시 다음으로 넘어가며 카운트 증가,
실패시 바로 멈추게 구현했다.
'Algorithm' 카테고리의 다른 글
| [백준] 1260. DFS와 BFS - JAVA (0) | 2025.09.08 |
|---|---|
| [백준] 1966. 프린터 큐 - JAVA (0) | 2025.09.01 |
| [백준] 2751. 수 정렬하기2 - JAVA (0) | 2025.08.18 |
| [백준] 10989. 수 정렬하기 - JAVA (0) | 2025.08.14 |
| [백준] 1929. 소수 구하기 - JAVA (0) | 2025.08.11 |