[백준] 1676번(팩토리얼0의 개) - Java 코드리뷰

Good_Day·2023년 3월 19일
0

백준풀이

목록 보기
2/3

문제유형

문제태그는 수학으로 되어있으며,
팩토리얼을 구해야하다보니 재귀함수의 구현도 같이 필요하다.
그리고 이런 말하기 뭐하지만...문제 지문해석이 조금 이상?어렵다....


✨ 문제해석

첫번쨰 줄에 N이 주어진다.
N!의 뒷자리부터 0이 아닌 숫자가 나올 때까지, 0의 개수를 구하라
즉, N! 을 구한 뒤 N!를 문자열로 구현한 후, 뒷자리부터 0이 아닌 숫자가 나오는 자리수-1 출력하라

✨ 문제풀이

문제해석만 보면 조금 말이 어려웠다...
N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수...?
N!의 값을 문자열로 보았을 때, 뒷 자리부터 0이 아닌 숫자가 나올 때까지 0의 개수.
즉, 10! = 3628800 을 뒷자리부터 보면 0이 2번 나오고 0이 아닌 8이라는 숫자가 나온다.
이 때 0이 아닌 숫자가 나오기까지 0이 2번 나왔으므로 2를 출력하면 된다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.math.BigInteger;
	
public class Main{
	
	public static void main(String[] args) throws Exception{
		
		BufferedReader inputStr = new BufferedReader(new InputStreamReader(System.in));
		
		int n = Integer.parseInt(inputStr.readLine());
		int answer = 0;
		BigInteger fc = factorial(BigInteger.valueOf(n));
		
		String str = String.valueOf(fc);
		
		for(int i = str.length() - 1; i >= 0; i--) {
			
			if(str.charAt(i) == '0') {
				answer++;
			}else {
				break;
			}
			
		}
		
		System.out.println(answer);
	}
	
	public static BigInteger factorial(BigInteger a) {
		
		if(a.compareTo(BigInteger.ONE) <= 0) {
			return BigInteger.ONE;
		}else {
			return a.multiply(factorial(a.subtract(BigInteger.ONE)));
		}
		
	}
}

✨ 코드풀이

① input을 n이라는 변수에 저장
② n의 펙토리얼을 구하기 위해 factorial이라는 함수를 호출한다.(factorial의 대해서는 추후 따로 리뷰할게용)
③ n!의 값을 문자열로 치환 후 뒷자리부터 확인하기 위해 for문을 length()-1부터 시작
④ 0이 나오면 answer을 증가시키고, 아닌 값이 나오면 break. 한번도 없다면 선언할 때 지정한 초기값 0 출력

profile
여신코어뱅킹 개발자

0개의 댓글