반응형
https://www.acmicpc.net/problem/9095
www.youtube.com/watch?v=R9WCxrPs2b8
규칙을 찾아내면 무척 간단한 문제다.
물론 나는 다이나믹 프로그래밍을 이제야 공부하기 시작해서 나에겐 쉽지 않은 문제였다.
우선 규칙을 찾으려는 방향성은 올바르게 갔다.
이 문제는 n 값이 11로 제한되어있어 메모제이션 방식을 사용하지 않고 재귀를 통한 완전탐색으로도 충분히 풀리는 문제이다.
너무 대충 끄적거린거라 좀 부끄러운데
뭐 대략 설명해보자면
우선 1,2,3 까지의 수는 미리 구해놔야한다. ex) 1 = 1 , 2 = 2, 3 = 4
그리고 4를 만드는 가장 큰 경우의 수들 먼저 살펴본다면
1. 3 + 1
2. 2 + 2
3. 1 + 3
3 + 1 에서 3을 만들 수 있는 경우의수는 4개라고 이미 알고있다.
2 + 2 에서 2를 만들 수 있는 경우의 수는 2개
1 + 3 에서 1 을 만드는 경우의 수는 1개
즉 4 + 2 + 1 = 7 이다.
5 또한 이런 방식으로 구할 수 있다.
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int ret =0;
int solve(int n)
{
if(n==1)
return 1;
if(n==2)
return 2;
if(n==3)
return 4;
return solve(n-1)+solve(n-2)+solve(n-3);
}
int main()
{
int cnt,v=0;
cin>>cnt;
int*arr = new int[cnt];
for(int i=0; i<cnt; i++)
{
cin>>v;
arr[i] = solve(v);
}
for(int i=0; i<cnt; i++)
cout<<arr[i]<<endl;
}
재귀를 통해 구현하였다.
반응형
'알고리즘문제' 카테고리의 다른 글
[프로그래머스]베스트앨범 C++문제풀이(map활용) (0) | 2020.10.26 |
---|---|
[프로그래머스]카펫 문제 풀이C++ (완전탐색, 약수 구하기) (0) | 2020.10.25 |
[백준 14502번]연구소 with 삼성전자 SW역량테스트 문제 (0) | 2020.10.10 |
[백준 1463번]다이나믹 프로그래밍 1로 만들기 (0) | 2020.09.03 |
[HakerRank]Minimum Swaps2_배열 정렬에 필요한 최소 스왑 횟수 구하기 (1) | 2020.04.26 |
댓글