※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 2057번 문제인 팩토리얼 분해이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/2057
2057번: 팩토리얼 분해
음 아닌 정수 N이 주어졌을 때, 이 수를 서로 다른 정수 M(M ≥ 1)개의 팩토리얼의 합으로 나타낼 수 있는지 알아내는 프로그램을 작성하시오. 예를 들어 2=0!+1!로 나타낼 수 있지만, 5는 이와 같은
www.acmicpc.net
N이 3 이상일 경우, N!의 값은 0부터 N-1까지의 각 정수의 팩토리얼의 합보다 항상 크다는 점을 이용하면 그리디한 접근으로 문제를 쉽게 해결할 수 있다.
0은 하나 이상의 정수의 팩토리얼의 합으로 나타낼 수 없으니 잘 예외처리해주자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
ll fact[20];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
fact[0] = 1;
for (ll i = 1; i < 20; i++) {
fact[i] = fact[i - 1] * i;
}
ll N; cin >> N;
if (N == 0) cout << "NO";
else {
for (int i = 19; i > -1; i--) {
if (N >= fact[i]) N -= fact[i];
}
if (N) cout << "NO";
else cout << "YES";
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 5679 // C++] Hailstone Sequences (0) | 2022.08.28 |
---|---|
[BOJ 2999 // C++] 비밀 이메일 (0) | 2022.08.28 |
[BOJ 24855 // C++] Natives (0) | 2022.08.28 |
[BOJ 14649 // C++] 문홍안 (0) | 2022.08.28 |
[BOJ 2553 // C++] 마지막 팩토리얼 수 (0) | 2022.08.28 |