반응형
백준 1003번 문제 - 피보나치 함수
1003번: 피보나치 함수
각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.
www.acmicpc.net
문제 분석
- N번째 피보나치 수를 구하는 다음 C++ 함수를 실행했을 때, N이 입력됬을 때 0과 1이 프린트되는 횟수를 출력해라.
int fibonacci(int n) {
if (n == 0) {
printf("0");
return 0;
} else if (n == 1) {
printf("1");
return 1;
} else {
return fibonacci(n‐1) + fibonacci(n‐2);
}
}
해결 키 포인트
- DP로 구현
- DP가 아니면 시간초과 발생
- 피보나치 수를 구하는 함수의 규칙을 보면,
결국에 fibonacci(n-1)의 0과 1이 프린팅 되는 횟수 + fibonacci(n-2)의 0과 1이 프린팅 되는 횟수이다. - fibonacci(0)하고 fibonacci(1)은 결과 값이 정해져있으므로 fibonacci(2)부터 값 구하기
- dp[n]의 0프린팅 횟수 = dp[n-1] 0프린팅 횟수 + dp[n-2] 0프린팅 횟수
- dp[n]의 1프린팅 횟수 = dp[n-1] 1프린팅 횟수 + dp[n-2] 1프린팅 횟수
코드
import java.io.*;
public class Main {
public static int [][] dp;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
dp = new int[41][2];
dp[0] = new int[]{1, 0};
dp[1] = new int[]{0, 1};
for (int i = 2; i < 41; 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 t = 0; t < T; t++) {
int n = Integer.parseInt(br.readLine());
bw.write(dp[n][0] + " " + dp[n][1] + "\n");
}
bw.flush();
bw.close();
}
}
반응형
'CodingTEST' 카테고리의 다른 글
[백준 9095] 1, 2, 3 더하기 (JAVA) (1) | 2023.12.06 |
---|---|
[백준 1463] 1로 만들기 (JAVA) (1) | 2023.12.05 |
[백준 17219] 비밀번호 찾기 (JAVA) (1) | 2023.12.05 |
[백준 11723] 듣보잡 (JAVA) (1) | 2023.12.05 |
[백준 1620] 나는야 포켓몬 마스터 이다솜 (JAVA) (0) | 2023.12.05 |