[백준/c++] 9095번 : 1,2,3 더하기
2502 단어 재귀다이나믹 프로그래밍다이나믹 프로그래밍
🌵 문제
🌵 풀이 1
- 6번째까지 직접 써보면서 규칙을 찾아보았다.
- 4번째 부터 f(n)=f(n-1)+f(n-2)+f(n-3) 규칙이 성립함을 찾았다.
- 각 테스트케이스 마다 n을 입력받고 ,func(n)에 해당하는 값을 리턴받아 출력 하였다.
- 이때, 이전 테스트케이스에서 이미 구한값이면 바로 리턴될 수 있도록 정답 배열인 answer[i]에 값이 들어와 있으면 건너뛰도록 하였다.
- 이 방식은 어쩌다 우연히 규칙을 발견한거라서 아래 재귀함수를 이용한 코드도 작성한다.
🌵 코드 1
//9095번: 1,2,3 더하기
#include <iostream>
using namespace std;
int answer[11];
int t,n;
int func(int n){
if(n==1)
return 1;
if(n==2)
return 2;
if(n==3)
return 4;
for(int i=4; i<=n; i++){
if(answer[i])
continue;
answer[i]=answer[i-1]+answer[i-2]+answer[i-3];
}
return answer[n];
}
int main(){
answer[1]=1;
answer[2]=2;
answer[3]=4;
cin>>t;
while(t--){
cin>>n;
cout<<func(n)<<"\n";
}
}
🌵 풀이 2
- func(cnt, sum, goal)에서 cnt는 현재까지 더한 수의 갯수, sum은 현재까지 합계, goal은 만들고자 하는 수 이다.
- 1,2,3으로 구성되므로 for문을 돌면서 재귀함수에 더한값을 반영하여 현재까지의 합을 매개변수로 전달한다.
- sum이 만들고자하는 수를 넘어가면 goal을 만들 수 없는 조합이므로 리턴한다.
- answer은 goal을 만드는 방법이 수 이고, 각 테스트 케이스 초기에 answer=0 으로 초기화 한다.
- goal이 만들어지면 answer를 ++하고 리턴한다.
🌵 코드 2
//9095번:1,2,3더하기 - 재귀함수 이용
#include<iostream>
using namespace std;
int t,n;
int answer=0;
void func(int cnt, int sum, int goal){
if(sum>goal)
return;
if (sum==goal){
answer++;
return;
}
for(int i=1; i<=3; i++){
func(cnt+1,sum+i,goal);
}
}
//cnt는 의미없어서 없애도 됨.
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>t;
while(t--){
cin>>n;
answer=0;
func(0,0,n); //cnt, sum의 초깃값은 0,0 이다.
cout<<answer<<"\n";
}
}
Author And Source
이 문제에 관하여([백준/c++] 9095번 : 1,2,3 더하기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@somyeong0623/백준c-9095번-123-더하기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)