

이 문제는 DP(Dynamic Programing)문제이다. 큰 문제를 작은 문제로 쪼개어 푸는 문제,, 피보나치 함수가 대표적인 예시이다. 우선 규칙을 찾아야한다.

문제에 대한 함수를 f(n)이라고 했을때, f(1)은 1이고, f(2)는 2이고, f(3)은 4이다. f(4) = 7이고 f(5)는 13이다. 여기서 규칙을 알 수 있다. f(n) = f(n-1) + f(n-2) + f(n-3) 으로 이루어진다. 따라서 제일 큰 입력값인 f(11)은 f(10)+f(9)+f(8) 으로 이루어질 것이다.


단순 재귀(아래 주석 코드)로 돌리면 아마 시간초과가 날 것이다. 제출을 해보지는 않았는데.. 그리고 실행도 안 해봤는데 아마 맞지않을까 아무튼. f(7)을 실행할때 f(6), f(5), f(4)를 계산할텐데, 나중에 f(11)을 입력받으면 다시 또 f(10), ... f(6), f(5), f(4) 를 계산하니까 비효율적이다. 그래서 배열을 만들고 값을 미리 저장해두었다가 필요할때 꺼내쓴다. 처음에는 계산이 안 되었다는 의미로 배열을 0으로 초기화해줬다.(main에서) 그리고 1,2,3 은 값을 그냥 주고 f(4)부터는 필요에 의해 계산하고, 값을 저장하도록 구현했다.
'코딩가딩가' 카테고리의 다른 글
| [JAVA]BOJ 11005, 진법 변환 2 (0) | 2024.07.13 |
|---|---|
| [JAVA]BOJ 10448, 유레카 이론 (0) | 2024.07.13 |
| [C]BOJ 1748, 수 이어 쓰기 1 (0) | 2024.07.12 |
| [JAVA]BOJ 3273, 두 수의 합 (0) | 2024.07.10 |
| [JAVA]BOJ 10989, 수 정렬하기 3 (0) | 2024.05.22 |