알고리즘

백준 파이썬 2004 조합 0의 개수

chaewonni 2023. 8. 15. 02:39

 

🚀접근하기

원래 팩토리얼을 구하는 것처럼 구하면 메모리 초과가 일어나서 다른 방법으로 풀어야했던 문제.

끝자리 0의 개수를 구하는 것인데, 끝자리가 0이되려면 a * 10^n 으로 표현이 돼야하고, 10은 2*5로 소인수 분해된다는 것을 생각하면 쉽게 풀리는 문제이다!

2와 5가 쌍을 이루어야 끝자리가 0이 될 수 있기 때문에(2가 아무리 많아도 5가 적으면 0의 개수는 5의 개수), 2와 5중 더 작은 개수를 가진 것을 출력해주면 된다.

🎉코드

n, m = map(int, input().split())

def two(num):
    two_cnt = 0
    n=1
    i=2
    while n != 0:
        n = num // i
        two_cnt += n
        i = i * 2
    return two_cnt

def five(num):
    five_cnt = 0
    n=1
    i=5
    while n != 0:
        n = num // i
        five_cnt += n
        i = i * 5
    return five_cnt

a = two(n) - two(m) - two(n-m)
b = five(n) - five(m) - five(n-m)

print(min(a,b))

 

 

2의 개수를 구하는 함수를 예로 들어서,

만약 num이 25라면

25 // 2 = 12

25 // 4 = 6

25 // 8 = 3

25 // 16 = 1

 

12 + 6 + 3 + 1 = 22

25의 2의 개수는 22개이다.

 

5의 개수를 구하는 함수도 위와 같은 방식으로 만들어주면 된다.

 

마지막엔 n의 2의개수 - m의 2의개수 - n-m의 2의개수를 구해주면 된다.

 

a,b중 min 값을 구하는 이유는 위에도 언급했듯이 2와 5가 쌍을 이루어야만 끝자리가 0이 될 수 있기 때문에 더 작은 것, 즉 쌍을 이루는 개수를 구하기 위함이다.

💪다짐

팩토리알 문제였지만 팩토리알은 쓰이지 않았던.. 아예 다른 방식으로 풀어야 했던 문제.
팩토리알에서 0의 개수 구하는 방법을 잊지 말아야겠다.