문제 원문: https://www.acmicpc.net/problem/1003
1003번: 피보나치 함수
각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.
www.acmicpc.net
관련 개념: 피보나치 수열과 재귀 (수학 기초내용이라 접음, 수학적으로 잘 모르겠으면 보세요)
수열이란 수의 나열로 이해하면 좋다. (고교 수학 과정에 포함)
수학적으로, 피보나치 수열은 a₀ = 0, a₁ = 1의 초기값을 가지고 앞의 두 수를 더하여 뒤의 수를 구하는 수열이다. 그러니까 a₂ = 1이고, a₃ = a₂ + a₁ = 2이다.
이를 일반화하여 점화식으로 쓰면 aₙ = aₙ₋₁ + aₙ₋₂로 표현할 수 있다.
이 점화식을 재귀기법을 활용하여 코드로 표현하면 문제 원문의 함수처럼 된다. 점화식을 그대로 코딩한 것이기 때문에 사람이 이해하기는 쉬우나 숫자가 커질수록 계산횟수가 기하급수적으로 커진다. 일반적으로 43 이상의 숫자는 연산 결과를 보기 어렵다.
제출 답안: http://boj.kr/e9d51a6ca6ff4f969254b1a92353c34c
l = [None] * 41
def fibo(n):
if n == 0:
l[0] = [1, 0]
if n == 1:
l[1] = [0, 1]
if l[n] == None:
l[n] = [fibo(n-1)[0] + fibo(n-2)[0], fibo(n-1)[1] + fibo(n-2)[1]]
return l[n]
t = int(input())
for i in range(t):
a = fibo(int(input()))
print(a[0], a[1])
해설:
재귀 방식 피보나치 함수에서 fibonacci(0)과 fibonacci(1)이 몇 번 출력되는지 구하는 문제이다.
사용되는 피보나치 함수 코드를 주므로 재귀에 대한 개념이 있다면 문제 이해가 어렵지 않다.
다만 입력 숫자의 범위는 40 이하이나 제한시간이 0.25초이기 때문에 메모이제이션 기법을 사용하지 않으면 시간초과가 뜬다. 그래서 문제 분류가 다이내믹 프로그래밍으로 되어있다.
메모이제이션(memoization)이란, 메모리에 저장한다는 뜻으로 컴퓨터가 동일한 연산을 많이 반복할 경우 동일 연산의 결과값을 저장해두고 활용하는 것을 말한다. 빈 배열을 미리 선언해두고 계산할 때 해당하는 값이 있는지 체크해서 없을 때만 새로 저장하면 된다.
'알고리즘 문제풀이' 카테고리의 다른 글
[파이썬] 백준 2941: 크로아티아 알파벳 (0) | 2023.07.26 |
---|---|
머릿말 (0) | 2022.12.07 |