λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

Algorithm/BOJ

[BOJ] 였λ₯΄λ§‰ 수(11057)

[λ°±μ€€(BOJ)] 였λ₯΄λ§‰ 수(11057) C++

문제 : BOJ_11057번 였λ₯΄λ§‰ 수

문제 μ„€λͺ…

DP

DP둜 ν•΄κ²°ν•  수 μžˆλŠ” 였λ₯΄λ§‰ μˆ˜μž…λ‹ˆλ‹€.

1λΆ€ν„° 1,000의 수 쀑 ν•˜λ‚˜μΈ N이 주어지면, N 자리둜 이루어진 였λ₯΄λ§‰ 수의 개수λ₯Ό κ΅¬ν•˜λŠ” λ¬Έμ œμž…λ‹ˆλ‹€.

μ—¬κΈ°μ„œ 였λ₯΄λ§‰ μˆ˜λž€, κ°€μž₯ 큰 μžλ¦Ώμˆ˜λΆ€ν„° κ°€μž₯ μž‘μ€ μžλ¦Ώμˆ˜κ°€ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ˜¬λΌκ°€μ•Ό ν•˜λŠ”λ°, 이 λ¬Έμ œμ—μ„  μˆ˜κ°€ 같아도 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ 인정해 μ€λ‹ˆλ‹€.

또 νŠΉμ΄ν•œ 점은 μˆ˜κ°€ 0으둜 μ‹œμž‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.


Solution

μ €λŠ” 2차원 dp 배열을 λ§Œλ“€μ–΄ 문제λ₯Ό ν•΄κ²°ν–ˆμŠ΅λ‹ˆλ‹€.

dp[수의 길이][κ°€μž₯ 큰 자릿수의 수] -> λ§Œμ‘±ν•˜λŠ” 수의 였λ₯΄λ§‰ 수의 개수

μš°μ„  N이 1인 경우λ₯Ό μƒκ°ν•΄λ΄…μ‹œλ‹€.

문제의 쑰건이 'μˆ˜λŠ” 0으둜 μ‹œμž‘ν•  수 μžˆλ‹€.' μž„μœΌλ‘œ, 0,1,2,3 ... 7,8,9 => 10κ°œκ°€ λ©λ‹ˆλ‹€.

μ•žμ„  2차원 λ°°μ—΄μ˜ 쑰건에 λ§žμΆ”λ©΄ dp[1][0]=1 , dp[1][1]=1 , ... dp[1][9]=1 이 ν• λ‹Ήλ©λ‹ˆλ‹€.

μ΄λ ‡κ²Œ ν•œ 자릿수의 였λ₯΄λ§‰ μˆ˜μ— λͺ¨λ‘ 1을 ν• λ‹Ήν•΄ μ£Όκ³ , μžλ¦Ώμˆ˜κ°€ μ˜¬λΌκ°„λ‹€λ©΄ κ΅¬ν•˜κ³ μž ν•˜λŠ” 수의 길이 -1의 dpλ₯Ό 봐주고 더 ν•΄μ£Όλ©΄ λ©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, 수의 길이가 3이고 κ°€μž₯ 큰 μžλ¦¬μˆ˜κ°€ 5인 였λ₯΄λ§‰ 수의 개수λ₯Ό κ΅¬ν•˜λ €κ³  ν•©λ‹ˆλ‹€.

κ·Έλ ‡λ‹€λ©΄, μΈμ ‘ν•œ μˆ˜κ°€ 같아도 μ˜€λ¦„μ°¨μˆœμ΄κΈ° λ•Œλ¬Έμ—,

dp[3][5] = dp[3-1][5] + dp[3-1][6] + dp[3-1][7] + dp[3-1][8] + dp[3-1][9];

μ΄λΌλŠ” 것을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

for 문을 μ‚¬μš©ν•΄ λ°”ν…€μ—… λ°©μ‹μœΌλ‘œ 각 였λ₯΄λ§‰ 수λ₯Ό ν• λ‹Ήν•΄ μ£Όλ©΄ 닡을 μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.


Description

  • vectorλ₯Ό μ΄μš©ν•΄ 2쀑 배열을 λ™μ ν• λ‹Ήν•˜μ˜€μŠ΅λ‹ˆλ‹€. (vector<vector<long long>>dp(N + 1, vector<long long>(10));)
  • λ§ˆμ§€λ§‰ N의 였λ₯΄λ§‰ 수의 κ°œμˆ˜λΌλŠ” 건 수의 길이가 N 일 λ•Œ, 0으둜 μ‹œμž‘, 1둜 μ‹œμž‘, ... , 9둜 μ‹œμž‘μ˜ λͺ¨λ“  κ²½μš°μ΄λ―€λ‘œ 이λ₯Ό 결괏값에 λ”ν•΄μ£Όμ—ˆμŠ΅λ‹ˆλ‹€.
  • MODλΌλŠ” μƒμˆ˜λ₯Ό λ§Œλ“€μ–΄λ†“κ³  mod 연산을 μ§„ν–‰ν–ˆμŠ΅λ‹ˆλ‹€.

#include <iostream>
#include <algorithm>
#include <vector>
#define MOD 10007
using namespace std;
int main(void) {
    int N;
    cin >> N;
    vector<vector<long long>>dp(N + 1, vector<long long>(10));
    for (int i = 1; i <= N; i++) {
        for (int j = 0; j <= 9; j++) dp[i][j] = 0;
    }
    for (int i = 0; i <= 9; i++) dp[1][i] = 1;
    for (int i = 2; i <= N; i++) {
        for (int j = 0; j <= 9; j++) {
            for (int k = j; k <= 9; k++) {
                dp[i][j] += dp[i - 1][k];
                dp[i][j] %= MOD;
            }
        }
    }
    int result = 0;
    for (int i = 0; i <= 9; i++) {
        result += dp[N][i];
        result %= MOD;
    }
    cout << result << '\n';
    return 0;
}

'Algorithm > BOJ' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

[BOJ] ν–‰μš΄μ˜ 바퀴(2840)  (0) 2022.03.10
[BOJ] νšŒμ „ν•˜λŠ” 큐(1021)  (0) 2022.03.10
[BOJ] 제곱수의 ν•©(1699)  (0) 2022.03.09
[BOJ] 동전 2(2294)  (0) 2022.03.09
[BOJ] 2xn 타일링(11726)  (0) 2022.03.09