Algorithm๐Ÿฅ‡

11057.์˜ค๋ฅด๋ง‰์ˆ˜

hae02y 2023. 11. 8. 11:13
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

์˜ค๋ฅด๋ง‰ ์ˆ˜๋Š” ์ˆ˜์˜ ์ž๋ฆฌ๊ฐ€ ์˜ค๋ฆ„์ฐจ์ˆœ์„ ์ด๋ฃจ๋Š” ์ˆ˜๋ฅผ ๋งํ•œ๋‹ค. ์ด๋•Œ, ์ธ์ ‘ํ•œ ์ˆ˜๊ฐ€ ๊ฐ™์•„๋„ ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์นœ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 2234์™€ 3678, 11119๋Š” ์˜ค๋ฅด๋ง‰ ์ˆ˜์ด์ง€๋งŒ, 2232, 3676, 91111์€ ์˜ค๋ฅด๋ง‰ ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.

์ˆ˜์˜ ๊ธธ์ด N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์˜ค๋ฅด๋ง‰ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ์ˆ˜๋Š” 0์œผ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.

## ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N (1 โ‰ค N โ‰ค 1,000)์ด ์ฃผ์–ด์ง„๋‹ค.

## ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ๊ธธ์ด๊ฐ€ N์ธ ์˜ค๋ฅด๋ง‰ ์ˆ˜์˜ ๊ฐœ์ˆ˜๋ฅผ 10,007๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งžํžŒ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
1 ์ดˆ 256 MB 51093 25041 19405 47.786%

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

ํ’€์ด

์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ๋ฆ„

์ž๋ฆฌ์ˆ˜ 0 1 2 3 4 5 6 7 8 9
1 1 1 1 1 1 1 1 1 1 1
2 10 9 8 7 6 5 4 3 2 1
3 55 45 ... ... ...

ํ‘œ๋ฅผ ๋ณด๋ฉด ์„ธ๋กœ๋Š” ์ž๋ฆฌ์ˆ˜ N์ด๊ณ , ๊ฐ€๋กœ๋Š” 0~9๊นŒ์ง€์˜ ์ˆซ์ž์ด๋‹ค.
์ฑ„์›Œ์ง„๊ฐ’์€ dp[n][i] n: ์ž๋ฆฌ์ˆ˜ , i:์ œ์ผ ๋’ท์ž๋ฆฌ ์ˆซ์ž ๋ฅผ ํ†ตํ•ด i๋ฅผ ๊ฐ€์ง€๊ณ  N์ž๋ฆฌ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ์„๋•Œ์˜ ๊ฐฏ์ˆ˜์ด๋‹ค.

n=1์ผ๋•Œ 0,1,2,3,4,5,6,7,8,9 ๊ฐ€ ๊ฐ€๋Šฅํ•˜๊ณ ,

n=2์ผ๋•Œ
i=0 ์ด๋ฉด 00 01 02 03 04 05 06 07 ...
i=1 ์ด๋ฉด 11 12 13 ...
์ˆœ์œผ๋กœ ๊ตฌํ• ์ˆ˜์žˆ๊ณ 
๋งˆ์ง€๋ง‰์ธ 9๋กœ๋Š” 99๋ฅผ ๋งŒ๋“ค์ˆ˜์žˆ๋‹ค.

์ฆ‰ ๊ทœ์น™์„ ์ฐพ์•„๋ณด๋ฉด, N์ž๋ฆฌ์ˆ˜์˜ i ๋ฒˆ๊ฐ’์€ n-1 ์ž๋ฆฌ์ˆ˜์˜ i ~ 9๊นŒ์ง€์˜ ๊ฐ’์„ ๋ชจ๋‘ ๋”ํ•œ๊ฐ’์ด๋‹ค.

for (int i = 2; i <= n; i++) {  
            for (int j = 0; j < 10; j++) {  
                for (int k = j; k < 10; k++) {  
                    dp[i][j] += dp[i - 1][k];  
                    dp[i][j] %= MOD;  
                }  
            }  
        }  

์ฝ”๋“œ

package ๊ธฐ์ดˆ1.Day20.์ •ํ•ด์˜;  

import java.util.Arrays;  
import java.util.Scanner;  

public class ์˜ค๋ฅด๋ง‰์ˆ˜ {  

    static int MOD = 10007;  

    public static void main(String[] args) {  
        Scanner sc = new Scanner(System.in);  

        //์ด์ „์ž๋ฆฌ๋งŒ ๊ณ ๋ คํ•˜๋ฉด ๋œ๋‹ค.  

        int n = sc.nextInt();  //์ž๋ฆฌ  

        int[][] dp = new int[n + 1][10];//n:์ž๋ฆฌ์ˆ˜ 10:๋งˆ์ง€๋ง‰์ˆ˜  

        Arrays.fill(dp[1], 1);  

        for (int i = 2; i <= n; i++) {  
            for (int j = 0; j < 10; j++) {  
                for (int k = j; k < 10; k++) {  
                    dp[i][j] += dp[i - 1][k];  
                    dp[i][j] %= MOD;  
                }  
            }  
        }  

        System.out.println(Arrays.stream(dp[n]).sum()%MOD);  
        sc.close();  
    }  
}

DP์™€ 3์ค‘ for๋ฌธ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ฒ˜์Œ์ด์—ฌ์„œ ๊ตฌํ˜„์ด ํž˜๋“ค์—ˆ๋‹ค. ์‰ฌ์šด๋ฌธ์ œ์ด๊ณ  ๋ถ„๋ช… ์ ‘๊ทผ๊นŒ์ง€ ํ–ˆ๋Š”๋ฐ 3์ค‘ for๋ฌธ์„ ์‚ฌ์šฉํ•ด๋„ ๋˜๋Š”์ง€ ์ƒ๊ฐ์ด ๋งŽ์•„์กŒ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ 

System.out.println(Arrays.stream(dp[n]).sum()%MOD); 

์ด๋ ‡๊ฒŒ ๋งˆ์ง€๋ง‰์— MOD ์—ฐ์‚ฐ์„ ์•ˆํ•ด์„œ 2๋ฒˆ์ •๋„ ๋” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์œ„์ชฝ์—์„œ๋งŒ ํ•ด์ฃผ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ์‹ค์ œ ๋‚˜์˜ค๋Š”๊ฐ’์—์„œ๋„ MOD๋ฅผ ํ•ด์ฃผ์ž.

๋ฐ˜์‘ํ˜•