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

 

'algorithm > BOJ' 카테고리의 다른 글

BOJ 15993번 1, 2, 3 더하기 8  (0) 2020.02.20
BOJ 15992번 1, 2, 3 더하기 7  (0) 2020.02.19
BOJ 15990번 1, 2, 3 더하기 5  (0) 2020.02.18
BOJ 15989번 1, 2, 3 더하기 4  (0) 2020.02.18
BOJ 15988번 1, 2, 3 더하기 3  (0) 2020.02.18

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

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

 

1, 2, 3 더하기4 문제와 같이 2차원배열로 해결하였습니다.

문제는 꽤 쉬웠는데.. 마지막에 답을 출력해줄때 %MOD를 안해줘서 계속 틀렸네요 ㅠ,,ㅠ

 

같은 수를 연속으로 사용하지 말라고 했으니, 직전에 사용한 수가 무엇인지를 알고있다가

현재 계산에서는 피해가는 식으로 재귀를 돌렸습니다.

단, dfs의 첫 시작은 지금까지와는 다르게 1,2,3 각각 확인해주셔야 합니다.

 

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
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
#define MOD 1000000009
 
ll dp[4][100002]; // dp[i][n] : i로 n을 만들수잇는 경우의 수
 
// 같은수를 "연속"해서 사용하면 안된다
// "연속" 을 체크해서 dfs를 구현한다
 
ll dfs(int num, int now) {
    if (num < 0return 0;
    if (num == 0return 1;
 
    ll& res = dp[now][num];
    if (res) return res;
 
    for (int i = 1; i <= 3; i++) {
        if (i != now) res += dfs(num - i, i)%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, i)%MOD;
 
        cout << ans%MOD << "\n";
    }
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

'algorithm > BOJ' 카테고리의 다른 글

BOJ 15992번 1, 2, 3 더하기 7  (0) 2020.02.19
BOJ 15991번 1, 2, 3 더하기 6  (0) 2020.02.18
BOJ 15989번 1, 2, 3 더하기 4  (0) 2020.02.18
BOJ 15988번 1, 2, 3 더하기 3  (0) 2020.02.18
BOJ 12101번 1, 2, 3 더하기2  (0) 2020.02.18

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

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

 

문제를 풀고나서 다른분들의 코드를 참고해봤는데

다들 1차원 dp로 푸시던데 저는 1,2,3 크기인 3*n 형태의 2차원 dp로 해결하였습니다.

 

dp[i][num] 의 의미는

현재 숫자 i를 기준 num 을 만들수있는 경우의 수를 의미합니다.

dp 를 설명하기 위해 풀이를 천천히 해보겠습니다.

 

1,2,3 으로 임의의 수 num 을 만들기 위해서는 1,2,3 더하기 의 기본문제처럼 풀게되면

112 121 211 같은 합의 경우는 같은데 경우의 수는 다르게 두는 '중복' 이 발생하게 됩니다.

이런 중복을 모두 같은 경우의 수로 보려면 1, 2, 3 을 이용해서

내림차순으로 만들거나 오름차순으로 만드는 둘중 한가지의 방법을 선택해야 된다고 생각했습니다.

만약 오름차순으로 한다고 가정하고, 1과 2만 사용한다고 생각한다면

1 1 2 라는 경우가 생기지만 1 2 1 , 2 1 1 같은 경우는 생기지 않기 때문입니다.

마찬가지로 1 3 은 되지만, 3 1 은 만들어지지 않는다는 뜻입니다.

 

저는 이를 위에서 말씀드린 점화식 dp[i][num] : 현재 숫자 i로 num을 만들 수 있는 경우의 수로 표현하였고

코드를 보시면 아시겠지만 내림차순으로 해결하였습니다.

현재 숫자가 2 이면 2와 1만 사용하지 3은 사용하지 않게 되는 것입니다.

 

아래에서 num은 만들어야하는 수이고, stand 는 3,2,1 중 1가지 숫자가 됩니다.

 

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
#include <iostream>
#include <algorithm>
using namespace std;
 
int n;
int dp[4][10001];
 
int dfs(int num, int stand) {
    // 중복없는 dfs를 만들어야 된다
    // 112 == 121 == 211 과 같은
    // 이럴 경우 오름차순 또는 내림차순에 의해서만 만들어지는 경우의 수를 구한다면 중복이 사라질 것이다
 
    if (num < 0return 0;
    if (num == 0return 1;
 
    int& res = dp[stand][num];
    if (res) return res;
 
    for (int i = stand; i >= 1; i--)
        res += dfs(num - i, i);
 
    return res;
}
 
int main() {
    ios::sync_with_stdio(0), cin.tie(0);
 
    int T; cin >> T;
 
    while (T--) {
        cin >> n;
        cout << dfs(n, 3)<< "\n";
    }
 
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

'algorithm > BOJ' 카테고리의 다른 글

BOJ 15991번 1, 2, 3 더하기 6  (0) 2020.02.18
BOJ 15990번 1, 2, 3 더하기 5  (0) 2020.02.18
BOJ 15988번 1, 2, 3 더하기 3  (0) 2020.02.18
BOJ 12101번 1, 2, 3 더하기2  (0) 2020.02.18
BOJ 11403번 경로 찾기  (0) 2020.02.17

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

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

 

9095번 문제에서 dp의 범위를 늘려준 문제입니다.

이외는 동일합니다.

 

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
#include <iostream>
using namespace std;
#define MOD 1000000009
typedef long long ll;
 
ll dp[1000002];
 
ll dfs(int num) {
    if (num < 0return 0;
    if (num == 0return 1;
 
    ll& res = dp[num];
    if (res) return res;
 
    for (int i = 1; i <= 3; i++)
        res += dfs(num - i) % MOD;
 
    return res;
}
 
int main() {
    ios::sync_with_stdio(0), cin.tie(0);
    int T; cin >> T;
    while (T--) {
        int n; cin >> n;
        cout << dfs(n) % MOD << "\n";
    }
    return 0;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter

'algorithm > BOJ' 카테고리의 다른 글

BOJ 15990번 1, 2, 3 더하기 5  (0) 2020.02.18
BOJ 15989번 1, 2, 3 더하기 4  (0) 2020.02.18
BOJ 12101번 1, 2, 3 더하기2  (0) 2020.02.18
BOJ 11403번 경로 찾기  (0) 2020.02.17
BOJ 11046번 팰린드롬??  (0) 2020.02.16

+ Recent posts