-
[백준] 24416. 알고리즘 수업 - 피보나치 수 1 (파이썬 python, pypy3)STUDY/CS 2024. 1. 7. 13:10반응형
다이나믹 프로그래밍 문제를 좀 더 풀어보고 싶어서 좀 더 어려운 문제를 풀어보았다.
문제
아래 의사 코드를 이용하여 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 실행 횟수를 한 줄에 출력한다.
백준 24416 해설
백준 24416 정답 코드 1 (pypy3)
#다이나믹 프로그래밍 num = int(input()) f = [0]*(num+1) fib_count = 0 fibo_count = 0 #피보나치 재귀호출 def fib(n): global fib_count if n == 1 or n == 2: return 1; # 코드1 else: fib_count += 1 return (fib(n - 1) + fib(n - 2)) #피보나치 동적 프로그래밍 def fibonacci(n): global fibo_count f[1], f[2] = 1, 1 for i in range(3,n+1): f[i] = f[i - 1] + f[i - 2] # 코드2 fibo_count += 1 return f[n] fib(num) fibonacci(num) print("%d %d" % (fib_count+1,fibo_count))
처음 python3로 제출했을 때는 시간 초과가 일어나서 pypy3으로 다시 제출하고 나서야 맞았다. 코드가 마음에 들지 않아서 다시 제출해야지 하는 생각을 가지고 있었다.
백준 24416 정답 코드 2 (python)
#다이나믹 프로그래밍 num = int(input()) #피보나치 재귀호출 def fib(n): f = [0] * (n+1) f[1], f[2] = 1 ,1 for i in range(3, n+1): f[i] = f[i - 1] + f[i - 2] return f[n] #피보나치 동적 프로그래밍 def fibonacci(n): return n - 2 print("%d %d" % (fib(num),fibonacci(num)))
피보나치 재귀호출 횟수를 동적 프로그래밍으로 구할 수 있다. 이 방법을 사용해 시간을 많이 줄일 수 있었다.
피보나치 동적 프로그래밍 횟수는 굳이 함수로 시간을 재지 않아도 n - 2번이라는 공식을 구할 수 있었기 때문에 그냥 값을 리턴하도록 만들었다.
결과 & 느낀점
한 문제를 수정해서 다시 풀어보니 좋았다.
피보나치 수를 구하면서 함수의 실행횟수를 구하는 것보다, 실행횟수가 n과 어떤 관계가 있는지 알아내고 함수를 계산하는게 더 빠른 길이었다. 다음에는 문제에 주어진 대로 따라가지 말고 어떤 방법이 더 효율적인지 생각해 보는 시간을 오래 가져야겠다.
pypy3이란 언어도 처음 알게 되었는데 파이썬보다 실행 시간이 적게 걸리는 언어인가보다. 파이썬과 어떤 차이가 있는지 자세히 알아보고 싶다.
반응형'STUDY > CS' 카테고리의 다른 글
python 입력 방법: input(), sys.stdin.readline()의 차이점 (0) 2024.04.30 웹 백엔드 프로젝트 회고 kpt | python, django 사용 (0) 2024.02.12 [백준] 17202. 핸드폰 번호 궁합 (파이썬 python) (2) 2023.12.30 [LeetCode] 412. Fizz Buzz 풀이 (python) (1) 2023.12.27 [LeetCode] 1672. Richest Customer Wealth 풀이 (java) (1) 2023.12.27