본문 바로가기
코딩테스트/BOJ

DP > 1, 2, 3 더하기 (9095번)

by 의정부핵꿀밤 2021. 9. 3.
728x90

문제

 


풀이 

아 재밌다(?)

당연히 재밌지 풀이 보고 풀었는데..ㅋㅋㅋㅋㅋ

이제 다시 감이 조금 살아는 나고있다!

DP는 같은 답 다시 구하면 안돼 -> 반복문이나 재귀함수로 구하고 구한 값은 배열에 저장해!

그 때 중요한건 뭐다? 점화식 구하기!!

이것만 하면 아직까진 어려운 문제 없었음....점화식 못구해서 문제지만ㅋㅋ

암튼 풀이는 음...

여기서 d[n]은 n을 1, 2, 3으로 나타내는 방법의 수이고, 여기서 아이디어는 수를 표현할 때 마지막 수가 뭐냐는거야

n = ㅇ+ㅇ+ㅇ+ ... + ㅇ + ㅁ

여기서 ㅁ이 뭐냐는 거지!!

ㅁ에 올 수 있는 건 1, 2, 3이잖아?

그럼 d[n] = d[n-1] + 1, d[n-2] + 2, d[n-3] +3 될 수 있겠지? (여기서 맨 뒤의 1, 2, 3은 걍 숫자야)

그럼 d[n]을 표현하는 방식은 d[n-1] + d[n-2] + d[n-3]이겠네~

흐름 ㅇㅋ?

보자마자 딱 오긴했는데 안 보면 아직까진 감이 안와...

목표는 이번주 내로 DP 끝내고 점화식 앵간하면 세울 수 있게 하는거야!


코드

 

bottom-up

#include <iostream>
#include <stdio.h>
#define MAX 12

int d[12];

using namespace std;

int main()
{
    ///bottom-up
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    
    int t;
    int n[100];
    int res[100];
    cin>>t;
    
    for(int i=0;i<t;i++)
    {
        cin>>n[i];
    }
    
    d[0]=0;
    d[1]=1;
    d[2]=2;
    d[3]=4;
    
    for(int j=0;j<t;j++)
    {
        for(int i=4;i<=n[j];i++)
        {
            if(d[i]!=0) continue;
            d[i]=d[i-1]+d[i-2]+d[i-3];
        }
    }

    
    for(int i=0;i<t;i++)
    {
        printf("%d\n",d[n[i]]);
    }

    return 0;
}

이거는 저기 중첩반복문에서 continue 대신 break를 써서 잠깐 아주 잠!깐! 헤맸다..ㅋㅋㅋ

자꾸 두번쨰 결과부터는 0이 나오더라구..

break를 하면 그냥 계산을 안해버려서 끝났나벼.. 암튼


Top-down

#include <iostream>
#include <stdio.h>
#define MAX 12

int d[12];

using namespace std;

int go(int n)
{
    if(d[n]!=0) return d[n];
    d[n]=go(n-1)+go(n-2)+go(n-3);
    return d[n];
}

int main()
{
    ///bottom-up
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    
    int t;
    int n[100];
    int res[100];
    cin>>t;
    
    for(int i=0;i<t;i++)
    {
        cin>>n[i];
    }
    
    d[0]=0;
    d[1]=1;
    d[2]=2;
    d[3]=4;
    
    for(int j=0;j<t;j++)
    {
        printf("%d\n",go(n[j]));
    }

    return 0;
}
728x90

'코딩테스트 > BOJ' 카테고리의 다른 글

DP > 카드 구매하기 2 (16194번)  (0) 2021.09.03
DP > 카드 구매하기 (11052번)  (0) 2021.09.03
DP > 2xn 타일링 2 (11727번)  (0) 2021.09.02
DP > 2xn 타일링(11726번)  (0) 2021.08.27
DP > 1로 만들기(1463번)  (0) 2021.08.24

댓글