본문 바로가기

알고리즘 공부 및 문제 풀이/백준(BOJ)

[c++] 백준 10872 팩토리얼

백준 단계별로 풀어보기 [재귀] 팩토리얼

https://www.acmicpc.net/problem/10872

 

10872번: 팩토리얼

0보다 크거나 같은 정수 N이 주어진다. 이때, N!을 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

[풀이]

팩토리얼을 재귀로 푸는 방식이야 매우 단순하고, TMP로 짠 코드에 대해서만 잠깐 복습하겠다. C++에서는 타입에 값을 부여해서 그 타입들을 가지고 연산을 할 수 있는데, 타입은 반드시 컴파일 타임에 확정되어야 한다. 따라서 컴파일 타임에 생성되는 코드로 프로그래밍을 하는 것을 메타 프로그래밍이라고 한다. 템플릿 메타 프로그래밍(TMP)를 이용해서 재귀적 구조를 나타낼 수 있다. 이때 N=1인 베이스 케이스는 템플릿 특수화를 이용해 처리한다. 

 

[코드]

-일반 함수

#include <iostream>

int fac(int n) {
    if (n == 1) return 1;
    else return n * fac(n - 1);
}

int main(void) {
    int n;
    std::cin >> n;
    std::cout << fac(n);
    return 0;
}

-TMP

#include <iostream>

template <int N>
struct factorial {
	static const int result = N * factorial<N - 1>::result;
};

template <>
struct factorial<1> {
	static const int result = 1;
};

int main(void) {
	std::cout << factorial<6>::result;
	return 0;
}