필요한 개념: 동적계획법
동적계획법이란?
영어로는 Dynamic Programming / DP라고 하며 특정 범위까지의 값을 구하기 위해서 각 부분 문제의 구해놓은 답을 저장하고 나중에 중복 되는 수가 나왔을때 전에 구해놓은 답을 가지고와 사용하는 효율적으로 값을 구하는 알고리즘 설계 기법입니다.
<동적 계획법 핵심 기술>
메모이제이션(memoization): 하향식 접근법
컴퓨터 프로그램이 동일한 계산을 반복해야 할때 함수 값을 계산한뒤 계산된 값을 메모리에 저장하여 프로그램 실행 속도를 빠르게 하는 기술입니다.
[문제]
![](https://blog.kakaocdn.net/dn/TtzcL/btqZ0sRIkTp/CDx0IxrtUZMthkTS7kjlU1/img.png)
![](https://blog.kakaocdn.net/dn/wWWtf/btqZ3f4VkgZ/bMJYrmxZsSrk8DsKXz40p0/img.png)
[문제해결방법]
피보나치 수는 앞에 두 수를 더하여 그 다음 수를 만들어내는 방식으로
ex) 0+1=1 , 1+1=2 , 1+2=3, 2+3=5, 3+5=8,
문제를 풀어야 하기 때문에 반복계산을 막기 위해 이전에 계산했던 값을 저장하고 불러오는 식으로 문제를 해결해야 합니다.
[코드리뷰]
import sys #구한 값을 저장해주기 위해 cnt0과 cnt1을 만들어 줍니다. cnt0 = [1, 0] #0의 갯수 cnt0=[1, 0, 1, 1, 2, 3] cnt1 = [0, 1] #1의 갯수 cnt1=[0, 1, 1, 2, 3, 5] for i in range(2, 41): cnt0.append(cnt0[i-1]+cnt0[i-2]) cnt1.append(cnt1[i-1]+cnt1[i-2]) #동적계획법을 사용하여 계산된 값을 리스트에 저장합니다. T = int(sys.stdin.readline()) for _ in range(T): n = int(sys.stdin.readline()) print(cnt0[n], cnt1[n])
[결과]
![](https://blog.kakaocdn.net/dn/pebXr/btqZ095rkgh/xYlReXZQDihi4ZsPsGq19k/img.png)
'알고리즘' 카테고리의 다른 글
[알고리즘]나무 자르기(백준 2905/파이썬) (0) | 2021.03.14 |
---|---|
[알고리즘] 하노이 탑 이동순서(백준 11729/파이썬) (0) | 2021.03.14 |
[알고리즘]파도반 수열(백준 9461 /파이썬) (0) | 2021.03.14 |
[알고리즘] 곱셈 (백준 2588) (0) | 2021.03.09 |
[알고리즘] 사칙연산 (백준 10869) (0) | 2021.03.09 |