[java][boj][s3] 1003. 피보나치 함수
728x90
 

1003번: 피보나치 함수

각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.

www.acmicpc.net

문제

다음 소스는 N번째 피보나치 수를 구하는 C++ 함수이다.

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);
    }
}

fibonacci(3)을 호출하면 다음과 같은 일이 일어난다.

  • fibonacci(3)은 fibonacci(2)와 fibonacci(1) (첫 번째 호출)을 호출한다.
  • fibonacci(2)는 fibonacci(1) (두 번째 호출)과 fibonacci(0)을 호출한다.
  • 두 번째 호출한 fibonacci(1)은 1을 출력하고 1을 리턴한다.
  • fibonacci(0)은 0을 출력하고, 0을 리턴한다.
  • fibonacci(2)는 fibonacci(1)과 fibonacci(0)의 결과를 얻고, 1을 리턴한다.
  • 첫 번째 호출한 fibonacci(1)은 1을 출력하고, 1을 리턴한다.
  • fibonacci(3)은 fibonacci(2)와 fibonacci(1)의 결과를 얻고, 2를 리턴한다.

1은 2번 출력되고, 0은 1번 출력된다. N이 주어졌을 때, fibonacci(N)을 호출했을 때, 0과 1이 각각 몇 번 출력되는지 구하는 프로그램을 작성하시오.

입력

첫째 줄에 테스트 케이스의 개수 T가 주어진다.

각 테스트 케이스는 한 줄로 이루어져 있고, N이 주어진다. N은 40보다 작거나 같은 자연수 또는 0이다.

출력

각 테스트 케이스마다 0이 출력되는 횟수와 1이 출력되는 횟수를 공백으로 구분해서 출력한다.

풀이

/*
 * 입력
 * 1. 테스트 케이스 T
 * 2. N(0<=N<40)
 * 출력
 * 1. 0이 출력되는 횟수와 1이 출력되는 횟수
 * 
 * >> 2차원 배열을 사용해서 0과 1을 저장
 * >> 이미 계산한 배열은 그대로 리턴
 */

https://read-me.tistory.com/94

 

[java][boj][s3] 1904. 01타일

1904번: 01타일 지원이에게 2진 수열을 가르쳐 주기 위해, 지원이 아버지는 그에게 타일들을 선물해주셨다. 그리고 이 각각의 타일들은 0 또는 1이 쓰여 있는 낱장의 타일들이다. 어느 날 짓궂은 동

read-me.tistory.com

이전에 풀었던 피보나치 수열에서 1차원 배열을 2차원 배열로 바꾸기만 하면 된다

코드

 package lv15_동적계획법1;

import java.util.*;
import java.io.*;

public class s3_1003_피보나치함수 {
	static Integer[][] num = new Integer[40][2];
	
	public static void main(String[] args) throws Exception {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringBuilder sb = new StringBuilder();
		
		int T = Integer.parseInt(br.readLine());
		
		num[0][0] = 1;
		num[0][1] = 0;
		num[1][0] = 0;
		num[1][1] = 1;
		
		for(int tc = 1; tc<=T; tc++) {
			int N = Integer.parseInt(br.readLine());
			
			fibonacci(N);
			
			sb.append(num[N][0]).append(" ").append(num[N][1]).append("\n");
			
		}
		
		System.out.println(sb);

	}

	//int 말고 Integer를 쓰는 이유
	// >> int는 자료형이라 null로 초기화 x
	// >> Integer는 클래스라 null 처리
	private static Integer[] fibonacci(int n) {
		if(num[n][0] == null || num[n][1] == null) {
			num[n][0] = fibonacci(n-1)[0] + fibonacci(n-2)[0];
			num[n][1] = fibonacci(n-1)[1] + fibonacci(n-2)[1];
		} 
		
		return num[n];
	}

}

결과

 

#자바 #java #boj #백준 #알고리즘

728x90

'알고리즘 > BOJ' 카테고리의 다른 글

[java][boj][s2] 1912. 연속합  (0) 2022.03.15
[java][boj][s3] 9461. 파도반 수열  (0) 2022.03.09
[java][boj][s2] 9184. 신나는 함수 실행  (0) 2022.03.08
[java][boj][s3] 1904. 01타일  (0) 2022.03.08
[java][boj][s1] 1629. 곱셈  (0) 2022.03.05