algorithm/BOJ

BOJ 15991번 1, 2, 3 더하기 6

_JunHo 2020. 2. 18. 21:45

BOJ : https://www.acmicpc.net/problem/15991

github : https://github.com/junho0956/Algorithm/blob/master/15991/15991/%EC%86%8C%EC%8A%A4.cpp

 

 

더하기 5번 문제에서도 %MOD 를 안해줘서 틀렸는데 이번에도 같은실수를 했습니다

그래서 고치고 다시 제출했는데 또 WA가 뜨길래 고민해봤습니다.

 

제 코드의 문제점은 짝수, 홀수를 고려해주지 않은 것이였고

그 이유는 합을 만드는 경우가 대칭이 이루어지기 위해서는

그 길이를 알아야했기 때문입니다.

 

설명은 코드에 주석처리 해놓았습니다.

 

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
31
32
33
34
35
36
37
38
39
40
41
#include <iostream>
using namespace std;
#define MOD 1000000009
typedef long long ll;
 
ll dp[4][100002];
 
ll dfs(int num, int now, int len) {
    if (num < 0)return 0;
    if (num == 0)return 1;
 
    ll& res = dp[now][num];
    if (res) return res;
 
    for (int i = 1; i <= 3; i++) {
        res += dfs(num - (i * 2), i, len+2)%MOD;
        // WA를 받았다.
        // 왜일까 생각해봤는데 대칭이 될려면 짝수 홀수를 생각해봤을 때
        // 현재까지의 길이가 짝수이고 다음 수를 고려할 때, 만약 num-i가 0이 된다면 대칭이 되지만
        // 현재까지의 길이가 홀수이고 다음 수를 고려할 때, 만약 num-i가 0이 된다면 대칭이 되지않는다
        if (num - i == 0 && len%2 == 0) res += dfs(num - i, i, len+1) % MOD;
    }
 
    return res%MOD;
}
 
int main() {
    ios::sync_with_stdio(0), cin.tie(0);
 
    int T; cin >> T;
    while (T--) {
        int num; cin >> num;
        ll ans = 0;
        for (int i = 1; i <= 3; i++) {
            ans += dfs(num - (i * 2), i, 2) % MOD;
            if(num-== 0) ans += dfs(num - i, i, 1) % MOD;
        }
        cout << ans % MOD << "\n";
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter