티스토리 뷰
✏️ 문제 링크
https://www.acmicpc.net/problem/24416
✏️ 문제 설명
✏️ 문제 풀이
피보나치 함수를 재귀함수와 동적프로그래밍으로 계산했을 때 각 함수를 얼마나 호출하는지에 관한 문제입니다.
전역변수로 cnt1을 선언하고 재귀함수 부분에서 return (fib(n - 1) + fib(n - 2));을 호출하기 직전에 cnt1에 1을 더해주시면 됩니다. 차피 n==1일때나 2일때까지 가고나면 알아서 계산을 다 해주기 때문에 이렇게 재귀 호출 횟수를 구할 수 있습니다
동적 프로그래밍으로 하는 계산횟수는 for문을 돌리기보다 쉽게 생각해보면 n-2번 호출하게 됩니다.
fib(n)값을 구하기 전에 미리 fib(1)과 fib(2)값을 지정해놓기 때문에 위의 사진처럼 for문을 돌린다면
1번째 값, 2번째 값을 빼놓고 계산을 하게 되므로 호출 횟수는 n-2입니다.
✏️ 문제 코드
#include<iostream>
using namespace std;
int cnt1 = 0, cnt2 = 0;
int fib(int n);
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n;
cin >> n;
fib(n);
cout << cnt1+1 << " " << n-2;
}
int fib(int n) {
if (n == 1 || n == 2) {
return 1;
}
else {
cnt1++;
return (fib(n - 1) + fib(n - 2));
}
}
✏️ 문제 링크
https://www.acmicpc.net/problem/24417
✏️ 문제 설명
✏️ 문제 풀이
24416번과 비슷하지만 이번엔 n의 범위가 더 커졌습니다. 그리고 mod연산도 추가로 해야 합니다.
우선 동적 프로그래밍의 호출 횟수는 위의 문제와 동일하게 n-2번이고, 출력할 때는 1,000,000,007로 나눠야 합니다
다음은 재귀 함수의 호출 횟수인데, 처음에는 24416번의 재귀 호출로 하였는데 메모리 초과가 떴습니다.
아마 n이 커져서 계속해서 힙에 메모리를 쌓다 보니까 메모리 초과가 나는 것 같습니다.
그래서 배열을 이용해서 for문을 돌렸습니다. 처음에는 20000001개의 크기를 가진 배열로 문제를 풀었는데
outofbounds가 나서 다시 방식을 바꿨습니다. long long형 a,b,c를 각각 0,1,1로 지정해놓고
n-2번의 for문을 돌리면서 각각
a = b%1000000007;
b = c%1000000007;
c = (a%1000000007 + b%1000000007)%1000000007; 로 갱신을 해줬습니다.
배열을 쓰는 대신 숫자 3개를 이용해서 접근을 하였습니다.
✏️ 문제 코드
#include<iostream>
using namespace std;
int main() {
int n;
cin>> n;
long long a, b, c;
a = 0;
b = 1;
c = 1;
for(int i= 0; i<n-2; i++){
a = b%1000000007;
b = c%1000000007;
c = (a%1000000007 + b%1000000007)%1000000007;
}
cout<< c <<" "<<n-2;
return 0;
}
'Algorithm > BOJ' 카테고리의 다른 글
[C/C++] 백준 2589번 - 보물섬 (0) | 2024.05.04 |
---|---|
[C/C++] 백준 31778번 - PPC 만들기 (0) | 2024.05.03 |
[C/C++] 백준 알고리즘 수업 - 너비 우선 탐색 문제 모음 (0) | 2024.04.30 |
[C/C++] 백준 알고리즘 수업 - 깊이 우선 탐색 문제 모음 (0) | 2024.04.29 |
[C/C++] 백준 16139번 - 인간-컴퓨터 상호작용 (4) | 2024.04.26 |
- Total
- Today
- Yesterday
- 알고리즘 공부
- DFS
- 유클리드 호제법
- DP
- 자료구조
- html
- 우선순위 큐
- CSS
- 자바
- 백준 풀이
- BFS
- C++ Stack
- 알고리즘
- 이분 매칭
- 유니온 파인드
- 스택
- java
- c++ string
- 반복문
- 에라토스테네스의 체
- 세그먼트 트리
- 자바스크립트
- HTML5
- Do it!
- 백준
- C++
- 투 포인터
- 카운팅 정렬
- 스프링 부트 crud 게시판 구현
- js
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |