BAEKJOON/수학
백준 3474번 [교수가 된 현우](C++) -yes6686- 티스토리
yes6686
2024. 8. 16. 14:31
728x90
반응형
SMALL
백준 문제 풀이: 3474 [교수가 된 현우]
문제 링크: https://www.acmicpc.net/problem/3474
문제 설명:
팩토리얼 n!
의 뒤에 붙는 0의 개수를 구하는 문제입니다. 이 값은 10의 소인수 분해에서 2와 5의 쌍에 의해 결정되며, 2의 개수는 항상 5보다 많기 때문에 5의 개수만 계산하면 됩니다.
문제 해결 코드
// 백준 3474 - 교수가 된 현우
#include <iostream>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int T;
cin >> T; // 테스트 케이스 개수 입력
while (T--) {
int n;
cin >> n; // 입력된 수 n
int cnt = 0; // 0의 개수를 저장할 변수
// 5의 배수로 나누며 5의 개수를 센다
for (int k = 5; k <= n; k *= 5) {
cnt += (n / k);
}
cout << cnt << '\n'; // 결과 출력
}
return 0;
}
코드 설명
코드의 주요 로직과 사용된 알고리즘 설명.
- 핵심 알고리즘:
- 팩토리얼에서 뒤에 붙는 0의 개수는 소인수 5의 개수에 의해 결정됩니다.
n
을 5의 배수로 나누며, 각 단계에서 포함된 5의 개수를 누적합니다.
- 구현 세부사항:
- 초기값
k = 5
에서 시작해,k
를 5씩 곱하면서 5의 거듭제곱을 확인합니다. - 만약
k > n
이 되면 반복을 종료합니다.
- 초기값
- 시간 복잡도 분석:
- 5의 거듭제곱을 반복문으로 확인하므로 O(log₅(n))입니다.
- 테스트 케이스가
T
개이므로 총 시간 복잡도는 O(T ⋅ log₅(n))입니다.
결과
제출 시, 모든 테스트 케이스에 대해 올바른 결과를 출력합니다.
다른 접근 방식이나 개선 사항이 있다면 댓글로 공유 부탁드립니다!
728x90
반응형
LIST