※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts