-
[백준(JAVA)] 1676 : 팩토리얼 0 의 개수 - BigInteger알고리즘/백준 - JAVA 2023. 11. 29. 20:00728x90
https://www.acmicpc.net/problem/1676
문제 풀기 전
팩토리얼 500이 얼마나 큰 숫자일지 가늠해보기 위해서 웹 상에 있는 팩토리얼 계산기를 통해 확인해보았다
대략적으로만 봐도 21억 (int 형의 표현 범위 약 ±21억) 은 기본으로 넘는 숫자인걸 확인할 수 있다아무리 봐도 int 형에는 담기지 않을 것 같아서 long 형으로 구현을 시도해보았으나
long 형 또한 20! 이후로는 계산 값이 정확히 나오지 않았다
따라서 더 큰 수를 담을 수 잇는 자료형을 확인하기로 했다
BigInteger 클래스
java.math 패키지의 BigInteger 클래스 API 문서의 앞 부분을 읽어보면,
불변의 임의의 정밀도 정수
모든 연산들은 마치 BigInteger 가 자바의 원시 int 형처럼 2'-보형 표기법으로 표현된 것처럼 동작
BigInteger는 자바의 모든 원시 정수 연산자들과 자바.lang.Math의 모든 관련 방식들에 아날로그를 제공한다.
(* 아날로그(analogues) : 기능이 유사한 것들, 유사체)
BigInteger는 모듈러 산술, GCD 계산, 소수 판별법, 프라임 생성, 비트 조작 및 기타 몇 가지 연산들도 제공한다.int 형 처럼 작동하면서 int 형이 가지고 있는 기능들을 유사하게 제공하고 있음을 확인할 수 있다
- BigInteger 클래스가 가진 필드 변수와 몇 가지 사칙연산(+나머지연산) 을 구하는 메소드
- 원하는 상수를 BigInteger 형태로 바꾸는 메소드
import java.math.Biginteger; class Main { public static void main(String[] args) { // Field Summary (필드변수) BigInteger a = BigInteger.ONE; // 상수 1 BigInteger b = BigInteger.TEN; // 상수 10 BigInteger c = BigInteger.ZERO; // 상수 0 // Method Summary BigInteger.add(a); // 더하기 연산 BigInteger.subtract(a); // 빼기 연산 BigInteger.multiply(a); // 곱하기 연산 BigInteger.divide(a); // 나누기 연산 BigInteger.mod(a); // 나머지 연산 // 상수로 변환하는 법 int n = 12435; BigInteger num = BigInteger.valueOf(n); // 12435 } }
풀이
- 입력 : BufferedReader
- 출력 : print (결과 값 하나만 반환하기 때문에 별도로 StringBuild 나 BufferedWriter 사용 X)
import java.io.BufferedReader; import java.io.InputStreamReader; import java.math.BigInteger; import java.io.IOException; 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 cnt = 0; String str = String.valueOf(factorial(n)); for (int i=str.length()-1; i<str.length(); i--) { if ((str.charAt(i)-'0') == 0) cnt++; else break; } System.out.println(cnt); } private static BigInteger factorial(int n) { if (n<=1) return BigInteger.ONE; BigInteger result = BigInteger.valueOf(n); for (int i=n; i>=2; i--) result = result.multiply(BigInteger.valueOf(i-1)); return result; } }
- BigInteger 를 활용해 for 문으로 factorial 함수를 구현
- 입력값 0 또는 1은 1
- 계산해서 가져온 값은 String 문자열에 담아 뒤에서부터 차례로 한 문자씩 0 인지 파악해서
cnt 값을 증가 시킨다 (누적합) - 0의 값이 연속해서 나와야하기 때문에 0 이 아니라면 바로 빠져나와서 값을 출력하면 된다
728x90