일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
Tags
- Database
- Data Structure
- 자바
- 리트코드
- network
- 프로그래머스
- frontend
- java
- db
- VIM
- 그레이들
- Python
- Graph
- react
- Algorithm
- 백준
- 동적 계획법
- git
- BFS
- DP
- 알고리즘
- 다이나믹 프로그래밍
- vscode
- TypeScript
- 안드로이드
- DFS
- Javascript
- CS
- Redux
- LeetCode
Archives
- Today
- Total
늘 겸손하게
백준 1003 - 피보나치 함수 ( Java ) 본문
wrote by : besforyou
문제 해설
n이 주어지고, 위 피보나치 함수를 실행했을때 0과 1이 반환되는 횟수를 출력하는 문제입니다.
단순히 위 함수를 실행해서 반환되는 0과 1의 횟수를 직접 구하는 알고리즘은 시간 초과가 뜹니다.
그래서 dp를 적용하여 문제를 해결해야합니다.
문제풀이
fibonacci(0)은 0을 1번, 1을 0번 반환하고 ---- (a)
fibonacci(1)은 0을 0번, 1을 1번 반환합니다. ---- (b)
fibonacci(2)는 fibonacci(1) + fibonacci(0)을 반환합니다. 그러므로 0을 1번, 1을 1번 반환합니다. ( a + b )
위를 통해서, n이 주어졌을때 0과 1이 반환되는 횟수는 함수에 n-1이 주어졌을때 반환한 0과 1의 개수와 함수에 n-2이 주어졌을때 반환한 0과 1의 개수를 더하면 구할 수 있음을 알 수 있습니다.
- 점화식으로 표현하면 dp[i] = dp[i-1] + dp[i-2]
- 단, 0과 1은 겹치지 않으므로 2개의 배열에서 따로 계산하여야합니다.
코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
import java.io.*;
public class Main {
public static void main(String [] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = 40;
int dp[][] = new int[N+1][2];
dp[0][0] = 1;
dp[0][1] = 0;
dp[1][0] = 0;
dp[1][1] = 1;
dp[2][0] = 1;
dp[2][1] = 1;
for (int i = 3 ; i <= N ; i++) {
dp[i][0] = dp[i-1][0] + dp[i-2][0];
dp[i][1] = dp[i-1][1] + dp[i-2][1];
}
int T = Integer.parseInt(br.readLine());
for (int i = 0 ; i < T ; i++) {
N = Integer.parseInt(br.readLine());
System.out.println(dp[N][0] + " " + dp[N][1]);
}
}
}
|
cs |
결과
'코딩 문제 > 백준' 카테고리의 다른 글
백준 12015 - 가장 긴 증가하는 부분 수열 2 (Java) (0) | 2022.05.28 |
---|---|
백준 9095 - 1, 2, 3 더하기 ( Java ) (0) | 2022.05.24 |
백준 14502 - 연구소 ( Java ) (0) | 2022.05.19 |
백준 1991 - 트리 순회 (0) | 2022.02.20 |
백준 1929 - 소수 구하기 - 에라토스테네스의 체 ( Java ) (0) | 2022.02.18 |