ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준(JAVA)] 1676 : 팩토리얼 0 의 개수 - BigInteger
    알고리즘/백준 - JAVA 2023. 11. 29. 20:00
    728x90

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


    문제 풀기 전

    팩토리얼 500이 얼마나 큰 숫자일지 가늠해보기 위해서 웹 상에 있는 팩토리얼 계산기를 통해 확인해보았다
    대략적으로만 봐도 21억 (int 형의 표현 범위 약 ±21억) 은 기본으로 넘는 숫자인걸 확인할 수 있다

    아무리 봐도 int 형에는 담기지 않을 것 같아서  long 형으로 구현을 시도해보았으나
    long 형 또한 20! 이후로는 계산 값이 정확히 나오지 않았다
    따라서 더 큰 수를 담을 수 잇는 자료형을 확인하기로 했다


    BigInteger 클래스

    클릭 시 BIgInteger API 문서로 이동

    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
Designed by planet-si