본문 바로가기
알고리즘/BOJ

[BOJ] 1676번 팩토리얼 0의 개수 / 사용언어 : 파이썬(python)

by 바른 호랑이 2021. 12. 22.
728x90
반응형

※ 문제링크 

 

1676번: 팩토리얼 0의 개수

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

www.acmicpc.net

해당문제는 팩토리얼을 사용하면 비교적 간단하게 풀 수 있는 문제였다. 수의 범위가 매우 작은 수준이었기에 팩토리얼 함수를 작성해서 풀어도 무방했으나 범위를 만약 늘렸다면 오버플로우 문제가 발생할 수도 있었기에 오버플로우 발생까지 고려하여 문제를 2가지 방법으로 풀어보았다. 문제를 푸는데 쓴 방법과 코드는 아래와 같다.

1번째 방법

1. 팩토리얼 값을 구할 함수를 작성한 후 값을 문자열 형태로 변환한다.

2. 변환한 문자열을 뒤에서부터 하나씩 확인하며 카운트한다.

2번째 방법

1. 팩토리얼 함수가 1부터 N까지의 값을 모두 곱한다는 성질을 이용하여 곱할 숫자들로 리스트를 만든다.

2. 곱할 숫자들에 2와 5가 몇번 들어가 있는지 각각 세고, 2와 5의 개수중 작은 값을 출력한다.

+ 0의 개수는 곧 10이 몇번 곱해졌는지와 동일 -> 2x5가 몇번 들어가 있는지를 셈하여 출력하는 방법

 

# 첫번째 방법
def factorial(number):
    if number < 2:
        return 1
    else:
        result = number * factorial(number-1)
        return result 

N = int(input())
K = str(factorial(N))
cnt = 0
T = -1
while K[T] == '0':
    cnt += 1
    T -= 1
print(cnt)

# 두번째 방법
N = int(input())
check_list = [x for x in range(1, N+1)]
two_cnt, five_cnt = 0, 0
check_point = 0
while check_point <= len(check_list)-1:
    while check_list[check_point] % 2 == 0:
        two_cnt += 1
        check_list[check_point] = check_list[check_point] // 2   
    while check_list[check_point] % 5 == 0:  
        five_cnt += 1
        check_list[check_point] = check_list[check_point] // 5
    check_point += 1   

if two_cnt < five_cnt:
    print(two_cnt)
else:
    print(five_cnt)

 

P.S 개발자가 되기위해 공부중입니다. 잘못된 부분을 댓글로 남겨주시면 학습하는데 큰 도움이 될 거 같습니다.

728x90
반응형

댓글