다음 소스는 N번째 피보나치 함수를 구하는 함수이다.
1 2 3 4 5 6 7 8 9 10 11 | 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이 출력되는 횟수를 공백으로 구분해서 출력한다.
-출처- 임백준 온라인 저지
간단한 문제라고 생각되서 우리 프갤러들도 생각 한번 해보는 시간을 가지자는 의미에서
올려봤어~! 내가 푼 시간은 0MS로 최적의 시간이 나오긴 했는데 메모리 부분에서 욕심이 좀 나서~~
다들 어떻게 풀면 괜찮을거같아? ㅎㅎ 내가 짠 코드도 공개할께~!
답글좀 달아바!! 그냥 지나치지말라구~
그냥 DP 인데여
네 dp맞는데 ㅋ 좀더 기발한 방법이 있을까해서
알고리즘형 나는 상향식 dp로 접근해봤는데 하향식 dp로 접근하는 방법이 있을까?
초등학생 수준 문제네. fibonacci(n)에서 1이 출력되는 횟수 자체가 그 피보나치 값이잖아. 0이 출력되는 횟수는 그 이전 피보나치 값이고.
캐싱 안할거면 a = b + c, c = b, b = a 로 하면 되지 않을까여
어차피 N ≤ 40 이니깐 답 미리 계산해 놓고 상수 처리해서 값 빼내는 게 제일 빠르고 메모리도 절약.
n이 커서 O(log n) 에 풀고 싶으면 행렬곱 하면 되져
N ≤ 40이니깐 성능을 논한다는 거 자체가 뻘짓. O(1)이나 마찬가진데 뭘.
O(40) = O(1) 아닌가?
성능은 좋아요 메모리를 절약해보고싶어요
40 * 4 밖에 안되는데 메모리 절약을 논하는 것도 에러. 좀 그럴 듯한 문제를 들고 와서 얘기해.
그냥 메모리만 생각하면 변수 세개만으로 풀수 있지 말입니다
오떠케!?
static 메모리로 빼면 메모리 추가로 차지하는 것도 없을텐데 뭘. 실행 파일 크기는 페이지 단위로 round up된다고.
그런데 각 n이 들어올때마다 새로 계산을 해야해서 성능으로 보자면 더 비효율적이지 말입니다.
근데 n이 크다고 했을때는 행렬곱으로 O(log n) 에 풀 수 있지 말입니다
그리고 피보나치는 변수 두 개만 있어도 됨.
ㅅㅅㅅ형 조언고마워 알고리즘형두 ^^
N > 40인 경우가 없으니깐 이 문제는 그런 논의 자체가 에러.
이 문제만 두고 봤을때는 그렇겠지.
if(n=<1) return n; else 형태로 가면 어떨까