둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (201)
    • BOJ (159)
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (30)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (6)
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
    • 자료구조 (14)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (1)
      • 힙 (1)
      • 정렬 (1)
    • C++ (6)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ STL (1)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (2)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • C++ STL
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • STL
  • Thread
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

BOJ/다이내믹 프로그래밍

1003: 피보나치 함수

2022. 1. 6. 16:27

1003번: 피보나치 함수(BOJ C/C++)

사용 언어: C

문제

다음 소스는 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이 출력되는 횟수와 0이 출력되는 횟수 모두 피보나치 수열을 따른다는 것이다. 그것을 염두해두고 코드를 구현했다.

#include <stdio.h>
#include <stdlib.h>

void fibo(int num) 
{
    int a=0, b=1, c;
    if (num==0)
        printf("1 0\n");

    else if (num==1)
        printf("0 1\n");
	
    else 
	{
        for (int i=1; i<num; i++) 
		{
            c=a+b;
            a=b;
            b=c;
        }
        printf("%d %d\n", a, b);
    }
}

int main(void) 
{
    int T, N;
    scanf("%d", &T);

    while(T--)
	{
        scanf("%d",&N);
        fibo(N);
    }
}
저작자표시 (새창열림)

'BOJ > 다이내믹 프로그래밍' 카테고리의 다른 글

2096번: 내려가기 (BOJ C++)  (0) 2023.05.04
1149번: RGB거리 (BOJ JAVA)  (0) 2023.03.24
11726번: 2×n 타일링 (BOJ C/C++)  (0) 2022.03.09
9095번: 1, 2, 3 더하기 (BOJ C/C++)  (0) 2022.02.22
1463번: 1로 만들기  (0) 2022.01.19
    'BOJ/다이내믹 프로그래밍' 카테고리의 다른 글
    • 1149번: RGB거리 (BOJ JAVA)
    • 11726번: 2×n 타일링 (BOJ C/C++)
    • 9095번: 1, 2, 3 더하기 (BOJ C/C++)
    • 1463번: 1로 만들기
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바