복's

[ 백준 - 1676 ] 팩토리얼 0의 개수 본문

알고리즘/백준

[ 백준 - 1676 ] 팩토리얼 0의 개수

나복이 2023. 11. 15. 10:42
728x90

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

 

1676번: 팩토리얼 0의 개수

N!에서 뒤에서부터 처음 0이 아닌 숫자가 나올 때까지 0의 개수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

쉽게 생각해서 재귀 함수로 풀었지만 통과되지 못했다.

  • 파이썬: Recursion Error
  • 자바: 틀렸습니다. (overflow)

표현하기에 큰 수가 나와서 문제였는데 파이썬은 체적으로 처리해주고, 자바의 경우 해당 케이스를 지원하는 클래스가 존재한다.


[ 📌 풀이 ]

  • 공통
    • 팩토리얼 1 ~ N 까지를 곱해서 구해준다.
    • 문자열로 변경 후 뒤에서부터 0의 개수를 구해준다.
  • 파이썬
    • 파이썬의 경우 큰 수에 대해서 따로 처리해줄 부분이 없어서 위와 같이 풀면 문제 없다.
  • 자바
    • BigInteger 클래스가 원시 타입으로 표현 불가능한 수에 대해서 표현 해주면서 연산 메소드도 제공해준다.

int 타입으로 하다가 long 타입으로 변경해서 답안 제출했는데 안되서 값을 확인해보니까 (0 <= N <= 500) 엄청나게 큰 수가 나왔다.

[ console ]


[ 📌 코드 - Python ]

"""
# Author    : Lee In Bok 
# Date      : 2023.11.15(Wen)
# Spend Time: 11m 29s
# Runtime   : 40 ms
# Memory    : 31120 KB
# Algoritm  : BigInteger
"""

import sys

N = int(sys.stdin.readline())
temp = 1

for n in range(1, N + 1):
    temp *= n

result = str(temp)
cnt = 0

for n in result[::-1]:
    if n == '0':
        cnt += 1
    else:
        break

print(cnt)

[ 📌 코드 - Java ]

/**
* Author    : Lee In Bok 
* Date      : 2023.11.15(Wen)
* Spend Time: 11m 29s
* Runtime   : 132 ms
* Memory    : 14576 KB
* Algoritm  : BigInteger
 */

package BaekJoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;

public class Q1676_temp {
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int N = Integer.parseInt(br.readLine());
        BigInteger temp = new BigInteger("1");
        int cnt = 0;

        for(long i = 1; i <= N; i++){
            temp = temp.multiply(BigInteger.valueOf(i));
        }

        String resultStr = temp.toString();

        for(int i = resultStr.length() - 1; i >= 0; i--){
            if(resultStr.charAt(i) == '0'){
                cnt += 1;
            } else {
                break;
            }
        }

        System.out.println(cnt);
    }
}

[ 📌 결과 - Python & Java ]

[ Result - Python & Java ]

728x90

'알고리즘 > 백준' 카테고리의 다른 글

[ 백준 - 9020 ] 골드바흐의 추측  (0) 2023.12.24
[ 백준 - 1377 ] 버블 소트  (2) 2023.11.24
[ 백준 - 11286 ] 절대값 힙  (1) 2023.11.05
[ 백준 - 2559 ] 수열  (0) 2023.11.03
[ 백준 - 12891 ] DNA 비밀번호  (2) 2023.10.29