๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ“š ์ „๊ณต ๊ณต๋ถ€/์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ•ด์„ ๋ฐ ์„ค๊ณ„

[์•Œ๊ณ ๋ฆฌ์ฆ˜] DP - ๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ(cpp)

N๋‹จ์˜ ๊ณ„๋‹จ์ด ์žˆ๊ณ , ํ•œ๋ฒˆ์— ๊ณ„๋‹จ์„ ํ•œ ๋‹จ ๋˜๋Š” ๋‘ ๋‹จ์„ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•˜์ž. 
์ตœ๋Œ€ ๋‘ ๊ตฐ๋ฐ์˜ ๊ณ„๋‹จ์—๋Š” ์žฅ์• ๋ฌผ์ด ์žˆ์–ด์„œ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์—†๋‹ค. 
์ด ๋•Œ N๋‹จ๊นŒ์ง€ ์˜ฌ๋ผ๊ฐ€๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. 

์ž…๋ ฅ 
ํ‘œ์ค€์ž…๋ ฅ์œผ๋กœ ์„ธ ์ •์ˆ˜ N A B๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. N์€ ๊ณ„๋‹จ์˜ ๋‹จ์ˆ˜๋กœ, 1 ์ด์ƒ 30 ์ดํ•˜์ด๋‹ค. 
A์™€ B๋Š” ์žฅ์• ๋ฌผ์ด ์žˆ๋Š” ๊ณ„๋‹จ์˜ ์œ„์น˜์ด๋‹ค. A์™€ B๋Š” 0 ์ด์ƒ N ์ดํ•˜์ธ ์ˆ˜์ด๋ฉฐ, A์™€ B๊ฐ€ ๊ฐ™์„ ์ˆ˜ ์žˆ๋‹ค. 
A, B ๊ฐ’์ด 0์ด๋ผ๋ฉด, ์ด๋Š” ์žฅ์• ๋ฌผ์ด ์—†๋‹ค๋Š” ๋œป์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด N, A, B๊ฐ€ 3, 0, 1์ด๋ผ๊ณ  ์ฃผ์–ด์ง€๋ฉด 
์ด 3๋‹จ์˜ ๊ณ„๋‹จ์ด ์žˆ๊ณ , ์žฅ์• ๋ฌผ์€ 1๋‹จ์—๋งŒ ์žˆ๋‹ค. ์กฐ๊ธˆ ๋” ์ƒ๊ฐํ•ด๋ณด๋ฉด N, A, B๊ฐ€ 3, 1, 0์œผ๋กœ ์ฃผ์–ด์ ธ๋„
๊ฐ™๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. 

์ถœ๋ ฅ
ํ‘œ์ค€์ถœ๋ ฅ์œผ๋กœ ํ•˜๋‚˜์˜ ์ •์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. N๋‹จ๊นŒ์ง€ ์˜ค๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์˜ ์ˆ˜์ด๋‹ค. 

ํžŒํŠธ 
๋งŒ์•ฝ 1๋‹จ, 2๋‹จ์„ ์˜ฌ๋ผ๊ฐˆ ์ˆ˜ ์žˆ๋‹ค๋ฉด, 1๋‹จ์— ์˜ฌ๋ผ๊ฐ€๋Š” ๋ฐฉ๋ฒ•์€ ํ•œ ๊ฐ€์ง€, 2๋‹จ์— ์˜ฌ๋ผ๊ฐ€๋Š” ๋ฐฉ๋ฒ•์€ ๋‘ ๊ฐ€์ง€์ด๋‹ค. 

์˜ˆ์ œ ์ž…๋ ฅ 1
3 0 1
์˜ˆ์ œ ์ถœ๋ ฅ 1
1

 

์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ˆ˜์—… ๋‘ ๋ฒˆ์งธ ๊ณผ์ œ๋Š” DP๋ฅผ ์ด์šฉํ•œ ๋ฏธ์…˜์ด์—ˆ๋‹ค!

ํ”ํžˆ ํŒฉํ† ๋ฆฌ์–ผ ๊ณ„์‚ฐ์œผ๋กœ ๋ฐฐ์šฐ๊ฒŒ ๋˜๋Š” dp๋Š” dynamic programming์˜ ์•ฝ์ž๋กœ, 

ํ˜„์žฌ์˜ ๊ฐ’์„ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „์— ์ €์žฅํ•ด๋†จ๋˜ ๊ฐ’์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค.

 

์•„๋ž˜๋Š” ๋งŒ์  ๋ฐ›์€ ๋‚ด ์ฝ”๋“œ์ด๋‹ค ๐Ÿ”ฅ

 

#include <iostream>
#include <vector>
using namespace std;

int main(){
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    int cnt=0;
    int n, a, b;
    cin >> n >> a >> b;

    vector<int> stair(n+1);
    stair[0] = 0;
    stair[1] = 1; // 1์ธต
    stair[2] = 2;

    if((a == 1 && b == 2) || (a == 2 && b == 1)){
        stair[1] = 0;
        stair[2] = 0;
    } else if(a == 1 || b == 1){
        stair[1] = 0;
        stair[2] = 1;
    } else if(a == 2 || b == 2){
        stair[1] = 1;
        stair[2] = 0;
    }

    for(int i=3; i<=n; ++i){
        if(i==a || i==b) {
            stair[i] = 0;
            continue;
        }
        stair[i] = stair[i - 1] + stair[i - 2];
    }

    cout << stair[n];
    return 0;
}

 

 

๋ฐฑ์ค€์—๋„ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์œผ๋‹ˆ ๊ทธ๊ฒƒ๋„ ํ’€์–ด๋ณด๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค.

https://www.acmicpc.net/problem/2579

 

2579๋ฒˆ: ๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ

๊ณ„๋‹จ ์˜ค๋ฅด๊ธฐ ๊ฒŒ์ž„์€ ๊ณ„๋‹จ ์•„๋ž˜ ์‹œ์ž‘์ ๋ถ€ํ„ฐ ๊ณ„๋‹จ ๊ผญ๋Œ€๊ธฐ์— ์œ„์น˜ํ•œ ๋„์ฐฉ์ ๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒŒ์ž„์ด๋‹ค. <๊ทธ๋ฆผ 1>๊ณผ ๊ฐ™์ด ๊ฐ๊ฐ์˜ ๊ณ„๋‹จ์—๋Š” ์ผ์ •ํ•œ ์ ์ˆ˜๊ฐ€ ์“ฐ์—ฌ ์žˆ๋Š”๋ฐ ๊ณ„๋‹จ์„ ๋ฐŸ์œผ๋ฉด ๊ทธ ๊ณ„๋‹จ์— ์“ฐ์—ฌ ์žˆ๋Š” ์ 

www.acmicpc.net