백준 1003번 피보나치 함수

2024. 8. 27. 17:04·C++
반응형

1003번: 피보나치 함수 (acmicpc.net)

 

피보나치 함수 성공

 
시간 제한메모리 제한제출정답맞힌 사람정답 비율
0.25 초 (추가 시간 없음) 128 MB 228663 71696 56750 33.548%

문제

다음 소스는 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 복사

3
0
1
3

예제 출력 1 복사

1 0
0 1
1 2

예제 입력 2 복사

2
6
22

예제 출력 2 복사

5 8
10946 17711

 


 

풀이법 :

동적 계획법(DP)을 통하여 각 숫자마다 피보나치 수열을 통해 몇 번의 0과 몇 번의 1을 출력하는지 map을 통하여 저장한다.

1. 피보나치 수열을 사용하는 과정에서 map에 해당 숫자 데이터가 있는지 확인한다.

2. 있다면 해당 데이터를 불러와 사용하며, 없다면 피보나치 수열을 통하여 계산한 후 이를 map에 추가한다.  

 

#include <iostream>
#include <map>

using namespace std;

struct dim
{
	long long int one;
	long long int zero;

	dim()
	{
		one = 0;
		zero = 0;
	}

	dim(int _one, int _zero)
	{
		one = _one;
		zero = _zero;
	}
};

long long int fibonacci(int n, long long int& OuterOne, long long int& OuterZero, map<int,dim>& m)
{
	if (m.find(n) != m.end())
	{
		OuterOne += m[n].one;
		OuterZero += m[n].zero;
		return 0;
	}

	int tmp;

	if (n == 0)
	{
		OuterZero++;
		return 0;
	}
	else if (n == 1)
	{
		OuterOne++;
		return 1;
	}
	else
	{
		tmp = fibonacci(n - 1, OuterOne, OuterZero, m) + fibonacci(n - 2, OuterOne, OuterZero, m);
		m.insert(pair<int, dim>(n, dim(OuterOne, OuterZero)));
	}

	return tmp;
}

int main()
{
	int count = 0;
	cin >> count;

	map<int, dim> m;

	for (int i = 0; i < count; i++)
	{
		int tmp;
		cin >> tmp;

		if (m.find(tmp)!=m.end())
		{
			cout << m[tmp].zero << " " << m[tmp].one << "\n";
			continue;
		}

		long long int One = 0;
		long long int Zero = 0;

		fibonacci(tmp, One, Zero, m);
		m.insert(pair<int, dim>(tmp, dim(One, Zero)));
		cout << Zero << " " << One << "\n";
	}
	
	return 0;
}
반응형
저작자표시 (새창열림)

'C++' 카테고리의 다른 글

KMP 알고리즘  (1) 2024.09.13
백준 11720번 숫자의  (0) 2024.08.27
하나의 정수 나눠 입력받기  (0) 2024.08.23
C++ STL 연산자 오버로딩  (0) 2022.05.15
그래픽스 과제 백업 22/04/05  (0) 2022.04.05
'C++' 카테고리의 다른 글
  • KMP 알고리즘
  • 백준 11720번 숫자의
  • 하나의 정수 나눠 입력받기
  • C++ STL 연산자 오버로딩
숯불돼지왕갈비
숯불돼지왕갈비
  • 숯불돼지왕갈비
    게임 개발 공부기
    숯불돼지왕갈비
  • 전체
    오늘
    어제
    • 분류 전체보기 (302)
      • 학교수업 (165)
      • 취업강의 (6)
      • C++ (49)
        • 코딩 테스트 (4)
      • Unreal Engine 5 (25)
        • MMORPG 개발 (25)
      • Unreal Engine 4 (44)
        • Omak Project (3)
        • Unreal Engine 4 개발일지 (9)
        • Unreal Engine 4 (32)
      • Unity (1)
        • 개발 일지 (1)
      • 수학 (3)
        • 소프트웨어 공학용 수학 (3)
      • DirectX 11 (4)
      • 게임 디자인 패턴 (2)
      • 포트폴리오 (1)
      • 자격증 (1)
        • 정보처리기사 (0)
        • SQLD (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
숯불돼지왕갈비
백준 1003번 피보나치 함수
상단으로

티스토리툴바