문제
피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.
이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.
n=17일때 까지 피보나치 수를 써보면 다음과 같다.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597
n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 n이 주어진다. n은 90보다 작거나 같은 자연수이다.
출력
첫째 줄에 n번째 피보나치 수를 출력한다.
예제 입력 1
10
예제 출력 1
55
예상 풀이 방법
솔직히 똑같은 문제인데 두 번 들어갔다고 생각하고 풀이 방법도 적기 전에 2747번 문제의 정답을 그대로 가져와서 썼다.
1차 코드
#include <stdio.h>
int main() {
int a = 0;
int b = 1;
int answer;
int n;
scanf("%d", &n);
// 일단 계산하기 까다로운 피보나치 수열의 1번째와 2번째를 예외처리
// 2보다 작을 경우
if (n < 2) {
// 인데 0일 경우
if (n == 0) {
printf("0");
}
// 인데 1일 경우
else {
printf("1");
}
}
else {
for (int i = 1; i < n; i++) {
answer = a + b;
a = b;
b = answer;
}
printf("%d", answer);
}
return 0;
}
1차 결과

1차 진단
안풀려서 조금 충격이었다.
하지만 어디까지나 피보나치 수를 사용하는 문제라면 일단 알고리즘에 문제는 없을 것으로 판단하고
다른 문제점을 찾기로 했다.
왜 2747번은 잘 풀렸으면서 2748번은 안풀리는지 차이점을 중점으로 비교했다.
문제 조건만 다르고 구성은 똑같았다.
2747번은 최대 45까지.
2748번(지금)은 최대 90번까지이다.
피보나치 수열이 90번대까지 가면 수가 많이 커진다. 아무래도 이전 수의 합이 되다보니 프로그램도 커진다.
그럼 답은 long long int밖에 없다고 본다.
2차 코드
#include <stdio.h>
int main() {
long long int a = 0;
long long int b = 1;
long long int answer;
int n;
scanf("%d", &n);
if (n < 2) {
if (n == 0) {
printf("0");
}
else {
printf("1");
}
}
else {
for (int i = 1; i < n; i++) {
answer = a + b;
a = b;
b = answer;
}
printf("%lld", answer);
}
return 0;
}
2차 결과

미흡했던 점
문제 조건 제대로 안읽고 좋다고 복붙하고 시작한 점
사이즈에 대한 지식 부족
개선 방안
사이즈와 그에 따른 수 가용 범위 암기 (혹은 이해) 필요
'C > BaekJoon' 카테고리의 다른 글
[C] 백준 10250 - ACM호텔 | BaekJoon (0) | 2023.08.03 |
---|---|
[C] 백준 9610 - 사분면 | BaekJoon (0) | 2023.08.02 |
[C] 백준 2747 - 피보나치 수 | BaekJoon (0) | 2023.08.02 |
[C] 백준 1977 - 완전제곱수 | BaekJoon (0) | 2023.08.01 |
[C] 백준 2920 - 음계 | BaekJoon (0) | 2023.07.28 |
문제
피보나치 수는 0과 1로 시작한다. 0번째 피보나치 수는 0이고, 1번째 피보나치 수는 1이다. 그 다음 2번째 부터는 바로 앞 두 피보나치 수의 합이 된다.
이를 식으로 써보면 Fn = Fn-1 + Fn-2 (n ≥ 2)가 된다.
n=17일때 까지 피보나치 수를 써보면 다음과 같다.
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597
n이 주어졌을 때, n번째 피보나치 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 n이 주어진다. n은 90보다 작거나 같은 자연수이다.
출력
첫째 줄에 n번째 피보나치 수를 출력한다.
예제 입력 1
10
예제 출력 1
55
예상 풀이 방법
솔직히 똑같은 문제인데 두 번 들어갔다고 생각하고 풀이 방법도 적기 전에 2747번 문제의 정답을 그대로 가져와서 썼다.
1차 코드
#include <stdio.h>
int main() {
int a = 0;
int b = 1;
int answer;
int n;
scanf("%d", &n);
// 일단 계산하기 까다로운 피보나치 수열의 1번째와 2번째를 예외처리
// 2보다 작을 경우
if (n < 2) {
// 인데 0일 경우
if (n == 0) {
printf("0");
}
// 인데 1일 경우
else {
printf("1");
}
}
else {
for (int i = 1; i < n; i++) {
answer = a + b;
a = b;
b = answer;
}
printf("%d", answer);
}
return 0;
}
1차 결과

1차 진단
안풀려서 조금 충격이었다.
하지만 어디까지나 피보나치 수를 사용하는 문제라면 일단 알고리즘에 문제는 없을 것으로 판단하고
다른 문제점을 찾기로 했다.
왜 2747번은 잘 풀렸으면서 2748번은 안풀리는지 차이점을 중점으로 비교했다.
문제 조건만 다르고 구성은 똑같았다.
2747번은 최대 45까지.
2748번(지금)은 최대 90번까지이다.
피보나치 수열이 90번대까지 가면 수가 많이 커진다. 아무래도 이전 수의 합이 되다보니 프로그램도 커진다.
그럼 답은 long long int밖에 없다고 본다.
2차 코드
#include <stdio.h>
int main() {
long long int a = 0;
long long int b = 1;
long long int answer;
int n;
scanf("%d", &n);
if (n < 2) {
if (n == 0) {
printf("0");
}
else {
printf("1");
}
}
else {
for (int i = 1; i < n; i++) {
answer = a + b;
a = b;
b = answer;
}
printf("%lld", answer);
}
return 0;
}
2차 결과

미흡했던 점
문제 조건 제대로 안읽고 좋다고 복붙하고 시작한 점
사이즈에 대한 지식 부족
개선 방안
사이즈와 그에 따른 수 가용 범위 암기 (혹은 이해) 필요
'C > BaekJoon' 카테고리의 다른 글
[C] 백준 10250 - ACM호텔 | BaekJoon (0) | 2023.08.03 |
---|---|
[C] 백준 9610 - 사분면 | BaekJoon (0) | 2023.08.02 |
[C] 백준 2747 - 피보나치 수 | BaekJoon (0) | 2023.08.02 |
[C] 백준 1977 - 완전제곱수 | BaekJoon (0) | 2023.08.01 |
[C] 백준 2920 - 음계 | BaekJoon (0) | 2023.07.28 |