개발 공부/알고리즘 문제풀이

[백준] 10872 팩토리얼, 10870 피보나치 수 5

5묘 2022. 8. 2. 18:36

10872번: 팩토리얼

 

10872번: 팩토리얼

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

www.acmicpc.net


풀이
팩토리얼은 3가지 방법으로 풀었다. 재귀 함수로 한번, 반복문을 이용해 한번, 파이썬 자체적인 내장함수를 이용해 한번. 내장함수를 쓰는 방법이 제일 오래 걸렸다. 

# 10872 팩토리얼
# 첫 번째 방법: 재귀함수
def fact(N):
    if N > 0:
        return N * fact(N-1)
    else:
        return 1

N = int(input())
ret = fact(N)
print(ret)

# 두 번째 방법 : 반복문 활용
N = int(input())
sum = 1
for i in range(N, 0, -1):
    sum *= i
print(sum)

# 세 번째 방법: math.factorial() 함수 활용 72ms로 이게 제일 시간 오래 걸림.
import math
N = int(input())
print(math.factorial(N))

10870번: 피보나치 수 5

 

10870번: 피보나치 수 5

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다. 이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가

www.acmicpc.net


풀이
피보나치 수열은 재귀 함수를 만들어서 풀었는데, 하다보니 Fibo(3), Fibo(4) 처럼 값이 이미 저장되어 있다면 더 빨리 풀 수 있을 것 같다는 생각을 했다. 이게 DP인 걸로 알고 있는데 나중에 동적 계획법을 배우면 적용해서 더 빨리 풀어볼 수 있을 듯.

# 10870 피보나치 수 5 (72ms)
# DP를 배우면 이미 배열에 값이 저장된 애는 패스하는 방법으로 시간을 단축할 수 있겠지.
def Fibo(N):
    if N > 2:
        arr[N] = Fibo(N-1) + Fibo(N-2)
    elif N > 0:
        arr[N] = 1
    else:
        arr[N] = 0

    return arr[N]

N = int(input())
arr = [0 for _ in range(N+1)]
ret = Fibo(N)
print(ret)