제로베이스 20220503 코테 연습
1. 피보나치 수열
-
다음 소스는 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이 출력되는 횟수를 공백으로 구분해서 출력한다.
풀이
def fibo(n):
if n == -1:
return 0
if n == 0:
return 1
else:
prev = 0
now = 1
tmp = prev + now
while n > 0:
tmp = prev + now
prev = now
now = tmp
n -= 1
return tmp
import sys
T = int(sys.stdin.readline())
for _ in range(0,T):
n = int(sys.stdin.readline()) - 1
print(fibo(n-1),fibo(n))
채점 결과
- 정답
리뷰
-
0이 출력되는 갯수는 n-1의 피보나치 수와 같고, 1이 출력되는 갯수는 n의 피보나치수와 같다.
-
단, n값에 -1을 해주어야 제대로 보정이 이루어진다.
-
어떠한 이유에서 이렇게 되는지는 사실 수학적인 증명을 해내지는 못했다. 귀납적으로 잘 굴러가니 납득했을뿐.
-
-
제시해준 c++함수를 기반으로 피보나치 수를 구하려 할 경우, 무조건 시간초과, 메모리 초과, 재귀횟수 초과 셋중 하나가 발생한다.
- 따라서 메모리를 줄이기 위해 이전의 두 값만 기억하고 그걸 더해가며 갱신하는 방식으로 피보나치 수를 구하는 방법을 간략하게 짜보았다.