본문 바로가기

STUDY/BAEKJOON

[백준 3474번] 교수가 된 현우

728x90

문제

알고리즘의 킹갓제너럴엠퍼러마제스티충무공알고리즘마스터 현우가 교수로 취임하였다!

그러나 학생들에게 크나큰 기대를 품고 첫 수업에 들어갔던 현우는 아무도 외판원 순회 문제(Traveling Salesman Problem, TSP)를 풀지 못하는 것을 보고 낙심하였다.

그 와중에 학생 남규는 TSP를 완전탐색으로 풀려고 하였고, 현우는 그걸 보고 경악을 금치 못한다. 왜냐면 TSP를 완전탐색으로 풀려면 O(N!)의 시간이 소모되는데, 이는 경악을 금치 못할 시간이기 때문이다.

그러나 남규는 O(N!)이 왜 큰지도 잘 모른다. 그래서 현우는 더더욱 경악을 금치 못하고, N!이 얼마나 큰지 대략적으로나마 알려주기 위해, 자연수 N이 주어지면 N!의 오른쪽 끝에 있는 0의 개수를 알려주기로 하였다.

그러나 현우는 경악을 금치 못하여 지금 코딩을 할 수 없는 상황이다. 여러분이 현우를 대신하여 프로그램을 작성하시오.

 

입력

첫째 줄에 테스트 케이스의 개수 T가 주어지고, 이어서 T개의 줄에 정수 N이 주어진다(1 <= N <= 1000000000).

 

출력

각 줄마다 N!의 오른쪽 끝에 있는 0의 개수를 출력한다.

 

예제 입력 1

6
3
60
100
1024
23456
8735373

 

예제 출력 1

0
14
24
253
5861
2183837

 

 


 

코드

 

정답 코드

 

import sys
input = sys.stdin.readline

T = int(input())

for _ in range(T):
    n = int(input())
    cnt = 0
    i = 5

    while i <= n:
        cnt += n // i
        i *= 5

    print(cnt)

 

 

  • 가장 오른쪽에 있는 0의 개수는 2와 5의 개수에 따라 결정된다
  • 2의 배수는 항상 5의 배수보다 많기 때문에 5의 배수의 개수만 구하면 된다
  • 여기서 25와 같은 5의 제곱수는 5가 두개 이상이기 때문에 제곱수는 한번 더 계산해줘야 한다
  • while 문을 통해 n보다 작은 5의 제곱수의 배수까지 계산해준다

 

0이나 10을 구한다는 문제에서는 항상 2와 5의 개수를 통해 구할 수 있다는 것을 생각해야겠다.

그리고 제곱수도 잊지 말고 기억해야겠다.

 

 

 

끝!!

 


[백준 3474번] 을 정리한 내용입니다.

'STUDY > BAEKJOON' 카테고리의 다른 글

[백준 2467번] 용액  (1) 2024.04.30
[백준 2003번] 수들의 합 2  (1) 2024.04.30
[백준 2512번] 예산  (0) 2024.04.29
[백준 2805번] 나무 자르기  (0) 2024.04.29
[백준] 1236번 성 지키기  (0) 2023.07.25