[BAEKJOON - C++] 2748번 : 피보나치 수 2

정다은·2023년 7월 2일
0

BAEKJOON

목록 보기
13/54
C++ 배우기 (51~100) 이 문제집을 참고하여 문제를 풀었습니다.

2023년 1월 ~ 2월에 프로그래밍을 공부하기 위해 풀었던 문제들이다.

🍑문제

피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.
이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.
n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.

n=17일때 까지 피보나치 수를 써보면 다음과 같다.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597

입력
첫째 줄에 n이 주어진다. n은 90보다 작거나 같은 자연수이다.

출력
첫째 줄에 n번째 피보나치 수를 출력한다.

🍑대략적인 틀

  • 일단 몇번째 피보나치 수를 구해야 할지 입력 받기
  • for문을 받은 수만큼 돌려서 피보나치수를 구함.
    • 배열에 저장하는 식으로 가야할듯
  • 구해진 피보나치 수를 출력

🍑오류 해결

  1. new 를 사용하면 버퍼오버런, vector를 사용하면 vector out of range..
    new 사용 했을 때는 num이 미정인 상태에서 확정인 코드를 써서 그런가? ㅠㅠ 그래서 int *fibo = new int[num] (num은 몇번 째 수를 구할지 정해 둔 것.) 의 num대신 10을 넣고 num에 5를 넣었더니 작동. 생각해보니 fibo[i + 2] = fibo[i] + fibo[i + 1]; 라는 식에서 for문이 돌아가면서 fibo[num+1] 에 수가 들어가게 되는데 fibonum 의 크기이니 넘칠 수 밖에 없을 것이다. 피보나치 수가 0부터 시작하는 것을 잊은 것이다.
    그래서 처음에 동적 배열을 선언 할 때 크기로 num+1 로 했는데도 똑같은 오류.. 결국에는 num+2로 선언했더니 성공!

  2. 그런데 백준에서 틀렸다고 한다.. ㅜㅜㅜ 그래서 하나하나 출력해봤는데 그 과정에 있는 숫자들 다 맞았다구… 그래서 질문게시판 가니 나같은 사람이 좀 있었다. 그댓글을 보고 90을 입력해보니 정말 -129924893028 와 같은 수가 나왔는데 int가 감당 가능한 영역이 넘은 것이다. 그래서 double로 수정 그랬는데도 틀렸다💢 아무래도 double은 실수형 변수여서 그런 것 같다… 나는 써본 자료형이 좀 적기 때문에 찾아보고 long long 을 사용해봤다. 드디어 맞았다…. ㅜㅜㅜㅜㅜㅜㅜ

  • 한가지 더 궁금한게 생겨서 시험 해봤다. double로 한 다음에 출력할 때 (int)로 강제 형 변환을 하는 것 이다. 그랬더니 안된다..
    아 생각해보니 하려면 long long으로 변환해야지 저 수 자체를 int가 감당 불가 하다는 것을 이제 알았다…

    확실히 계산문제 같은 경우에는 그 변수가 감당 가능한 범위내의 값만이 나오는지 알아봐야겠다.

    처음부터 longlong
    double → 나중에 long long 형 변환

    double에도 표현 한계가 있는 듯 싶다. 내가 너무 변수의 타입에 대해서 가볍게 생각한 것은 아닌가 하는 생각이 들게 하는 문제 였다.

🍑 작성한 코드

// 피보나치 수 2

#include <iostream>
using namespace std;

int main() {
	int num;
	cin >> num;

	long long* fibo = new long long[num + 2];
	fibo[0] = 0;
	fibo[1] = 1;

	for (int i = 0; i < num; i++) {
		fibo[i + 2] = fibo[i] + fibo[i + 1];
	}

	cout << fibo[num];

	delete[]fibo;
}
profile
보안 공부하는 대학교 3학년 / 시리즈에서 더욱 편하게 글을 찾아보실 수 있습니다:)

0개의 댓글