programming

Layer7 과제 - 백준 10872번

leesu0605 2022. 4. 13. 00:45

코드


#include <stdio.h>

int f(int n){
        if(n<=1)
                return 1;
        return n*f(n-1);
}

int main(){
        int n;
        scanf("%d", &n);
        printf("%d", f(n));
}


· 간단한 문제이다. 그냥 f의 인자가 1보다 작거나 같을 때까지 현재 n값과 f(n-1)을 계속 곱해주며 그 누적값을 팩토리얼값으로 정한다.

· 이 문제는 간단한 팩토리얼 구하기 문제이다. 이런 문제를 풀 때 고려해야할 점은 바로 예외케이스이다. 나도 처음엔 '처음엔 팩토리얼 함수의 마지막 호출의 n값은 1이겠지'라고 생각하고 풀었지만, 예외케이스로 1을 넣어보니 시간초과가 나왔다. 1을 테스트케이스로 넣으면 f(0)을 호출하게 되기 때문에 이에 대한 처리 코드가 없어 계속 자기자신을 호출하게 된다. 두 번째 예외케이스로는 수의 범위가 어떤지 알아야 한다. 이렇게 팩토리얼, 제곱수 이용 문제 같은 경우(시간 복잡도가 O(n!)이거나 O(n^m) 같은 것도 포함..)는 테스트케이스의 수나 양이 조금만 커져도 처리해야할 수가 기하급수적으로 커지게 때문에 꼭 int 범위를 초과하지는 않는지, 시간 복잡도가 어떻게 되는지 등을 생각해야 한다. 그러나 이 문제는 12까지밖에 들어오지 않기 때문에 int를 사용해도 풀 수 있다.