알고리즘 :: 큰돌 :: Chapter2 - DFS/BFS :: 백준 3474 교수가 된 현우

Embedded June·2023년 6월 30일
0
post-thumbnail

문제

문제 링크

해설

  • 이런 종류의 문제는 항상 ‘정확히 해당 숫자’를 구할 필요가 없고, 오버플로 때문에 시간 내에 구할 수도 없습니다.
  • 대략 10!를 직접 손으로 해보면 어떻게 풀 수 있을지 감이 잡힙니다.
    • 1, 2, 3, 4 팩토리얼은 0이 없습니다.
    • 5! = 5 × 4 × 3 × 2 × 1 = 120
      6! = 6 × 5 × 4 × 3 × 2 × 1 = 720
      7! = 7 × 6 × 5 × 4 × 3 × 2 × 1 = 5040
      8! = 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1 = 40320
      9! = 9 × 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1 = 362880
      5, 6, 7, 8, 9 팩토리얼은 끝에 0이 1개 있습니다.
    • 여기까지 하면 대략적으로 감이 잡힙니다.
  • 즉, ‘0’이 만들어지기 위해서는 2와 5가 곱해져야 하는데, 팩토리얼 과정에서 무수히 많은 2가 곱해집니다. 따라서 남은 재료는 ‘5’가 됩니다.
  • 따라서 ‘0’은 5의 배수 때마다 한 개씩 늘어나게 됩니다. 어디 볼까요?
    • 10! = 10 × 9 × 8 × 7 × 6 × 5 × 4 × 3 × 2 × 1 = 3628800 으로 0이 2개죠?
    • 왜냐하면 10이 2 × 5이므로 위 식에서 5가 2개기 때문입니다.
  • 마지막으로 주의해야 하는건 25, 125와 같이 5의 제곱인 경우 입니다.
    • 이건 5의 배수지만, 5가 2개, 3개가 있는 경우이므로 따로 카운팅을 해줘야 합니다.
  • 위 내용들을 정리하면
  • for (int i = 5; i <= N; i *= 5) answer += N / i; 한 줄로 표현할 수 있습니다.

코드

#include <iostream>
using namespace std;

int main() {
    ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
    int T;
    cin >> T;
    while (T--) {
        int N;
        cin >> N;

        int answer = 0;
        for (int i = 5; i <= N; i *= 5) answer += N / i;

        cout << answer << '\n';
    }
    return 0;
}

소스코드 링크

결과

profile
임베디드 시스템 공학자를 지망하는 컴퓨터공학+전자공학 복수전공 학부생입니다. 타인의 피드백을 수용하고 숙고하고 대응하며 자극과 반응 사이의 간격을 늘리며 스스로 반응을 컨트롤 할 수 있는 주도적인 사람이 되는 것이 저의 20대의 목표입니다.

0개의 댓글