본문 바로가기
백준

백준 2688 줄어들지 않아

by 콩순이냉장고 2022. 4. 7.

문제 URL : https://www.acmicpc.net/problem/2688

 

2688번: 줄어들지 않아

첫째 줄에 테스트 케이스의 개수 T(1 <= T <= 1,000)이 주어진다. 각 테스트 케이스는 숫자 하나 n으로 이루어져 있다. (1 <= n <= 64)

www.acmicpc.net

 

문제 접근법 : 

직접 숫자를 만들어보시면 알수있습니다.

 

길이가 1인 수 : 0 ,1,2,3,4,5,6,7,8,9 이것들은  ->각각 1개씩
길이가 2인수 :

00,01,~~~,09, :10개

11,12, 13, ~~19, :9개

~~ .

88,89, :2개 

99 : 1개

 

길이가 3인수

000~ 099,

111~199

222~299

~

888~899

999를 

직접 코드로 만들어보면 그갯수를 구하는거니 그규칙이있습니다.

 

첫자리가 0로 시작하면 그뒤에는 0123456789가 전부 들어갈수있습니다.

첫자리가 1로 시작하면 그뒤에는 1~9까지 전부 들어갈수있습니다.

이것을 반복적으로하면

...

첫자리가 8로 시작하면 그뒤에는 8~9까지 전부 들어갈수있고

첫자리가  9로 시작하면 그뒤에는 9만 들어갈수 있습니다.

 

이러한 규칙성으로인해 점화식은 쉽게나옵니다.

 

점화식 : 길이가 n일때 t로 시작하면 길이가 n-1 t~9까지의 경우의수를 전부 더해주면 되는겁니다.

 

소스코드 :

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
#include<bits/stdc++.h>
using namespace std;
long long dp[65][10];
int n;
void init() {
    for (int i = 0; i < 10; i++)dp[1][i] = 1;
    for (int len = 2; len <= 64; len++) {
        for (int i = 0; i < 10; i++) {
            for (int j = i; j < 10; j++) {
                dp[len][i] += dp[len - 1][j];
            }
        }
    }
}
void input() {
    cin >> n;
}
void solve(){
    long long res = 0;
    for (int i = 0; i < 10; i++)
        res += dp[n][i];
    cout << res << "\n";
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    init();
    int test;
    cin >> test;
    while (test--) {
        input();
        solve();
    }
}
cs

 

 

궁금한점 혹은 모르는점 어떤 질문이든 댓글은 언제나 환영입니다.

'백준' 카테고리의 다른 글

백준 17472 다리 만들기 2  (0) 2022.05.17
백준 16437 양 구출 작전  (0) 2022.05.17
백준 1103 게임  (0) 2022.04.07
백준 20005 보스몬스터 전리품  (0) 2022.03.30
백준 9328 열쇠  (0) 2022.03.29