문제
오늘도 서준이는 동적 프로그래밍 수업 조교를 하고 있다. 아빠가 수업한 내용을 학생들이 잘 이해했는지 문제를 통해서 확인해보자.
오늘은 n의 피보나치 수를 재귀호출과 동적 프로그래밍으로 구하는 알고리즘을 배웠다. 재귀호출에 비해 동적 프로그래밍이 얼마나 빠른지 확인해 보자. 아래 의사 코드를 이용하여 n의 피보나치 수를 구할 경우 코드1 코드2 실행 횟수를 출력하자.
피보나치 수 재귀호출 의사 코드는 다음과 같다.
fib(n) {
if (n = 1 or n = 2)
then return 1; # 코드1
else return (fib(n - 1) + fib(n - 2));
}
피보나치 수 동적 프로그래밍 의사 코드는 다음과 같다.
fibonacci(n) {
f[1] <- f[2] <- 1;
for i <- 3 to n
f[i] <- f[i - 1] + f[i - 2]; # 코드2
return f[n];
}
입출력 예시
입력: 첫째 줄에 n(5 ≤ n ≤ 40)이 주어진다.
출력: 코드1 코드2 실행 횟수를 한 줄에 출력한다.
입력예시1)
5
출력예시1)
5 3
입력예시2)
30
출력예시2)
832040 28
코드
cnt_func = 0
def fibo(n):
global cnt_func
if n == 1 or n == 2:
cnt_func += 1
return 1
else: return fibo(n - 1) + fibo(n - 2)
x = int(input())
fibo(x)
print(cnt_func, x - 2)
어차피 dp는 1, 2번째 제외하고 한 번씩만 호출되니까 그냥 -2 해줬다.
실행 화면
채점 결과
처음에 python3로 제출하니까 시간초과가 나와서 pypy3로 제출했다.
재귀라서 그릉가 시간초과가 뜨더라 ㅇ.ㅇ
728x90
'문제 풀이 > [BaekJoon]' 카테고리의 다른 글
[BaekJoon] 번호 제목 (티어) - 언어 (0) | 2023.01.15 |
---|---|
[BaekJoon] 2206 벽 부수고 이동하기 (Gold 3) - Python (0) | 2023.01.12 |
[BaekJoon] 1753 최단경로 (Gold 4) - Python (0) | 2023.01.10 |
[BaekJoon] 12865 평범한 배낭 (Gold 5) - Python (0) | 2023.01.10 |
[BaekJoon] 13549 숨바꼭질 3 (Gold 5) - Python (0) | 2023.01.10 |