Algorithm๐Ÿฅ‡

10844.์‰ฌ์šด๊ณ„๋‹จ์ˆ˜

hae02y 2023. 11. 1. 01:54
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

45656์ด๋ž€ ์ˆ˜๋ฅผ ๋ณด์ž.

์ด ์ˆ˜๋Š” ์ธ์ ‘ํ•œ ๋ชจ๋“  ์ž๋ฆฌ์˜ ์ฐจ์ด๊ฐ€ 1์ด๋‹ค. ์ด๋Ÿฐ ์ˆ˜๋ฅผ ๊ณ„๋‹จ ์ˆ˜๋ผ๊ณ  ํ•œ๋‹ค.

N์ด ์ฃผ์–ด์งˆ ๋•Œ, ๊ธธ์ด๊ฐ€ N์ธ ๊ณ„๋‹จ ์ˆ˜๊ฐ€ ์ด ๋ช‡ ๊ฐœ ์žˆ๋Š”์ง€ ๊ตฌํ•ด๋ณด์ž. 0์œผ๋กœ ์‹œ์ž‘ํ•˜๋Š” ์ˆ˜๋Š” ๊ณ„๋‹จ์ˆ˜๊ฐ€ ์•„๋‹ˆ๋‹ค.

## ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— N์ด ์ฃผ์–ด์ง„๋‹ค. N์€ 1๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 100๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

## ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— ์ •๋‹ต์„ 1,000,000,000์œผ๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งžํžŒ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
1 ์ดˆ 256 MB 136447 43731 31781 30.389%

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

ํ’€์ด

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

์ž๋ฆฌ์ˆ˜๊ฐ€ 100, ์ฆ‰, 100์งธ ์ž๋ฆฌ ์ˆ˜๊นŒ์ง€ ์ฃผ์–ด์ง€๋Š” ๋ฌธ์ œ์ด๋‹ˆ long ํƒ€์ž…์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์•ผํ•œ๋‹ค. ์ด๋ฌธ์ œ์—์„œ ๊ฐ€์žฅ ํฌ์ธํŠธ๋Š” ์ธ์ ‘ํ•œ ๋ชจ๋“ ์ˆ˜๊ฐ€ 1์”ฉ ์ฐจ์ด๋‚œ๋‹ค ๋Š” ๊ฒƒ์ด๋‹ค. ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์ž.

1) N๋ฒˆ์งธ ์ž๋ฆฌ์ˆ˜์˜ ์ž๋ฆฟ๊ฐ’์ด 0์ธ๊ฒฝ์šฐ : ๋‹ค์Œ ์ž๋ฆฌ์ˆ˜๋Š” 1๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
2) N๋ฒˆ์งธ ์ž๋ฆฌ์ˆ˜์˜ ์ž๋ฆฟ๊ฐ’์ด 9์ธ๊ฒฝ์šฐ : ๋‹ค์Œ ์ž๋ฆฌ์ˆ˜๋Š” 8๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, 10X ๋ผ๊ณ  ํ• ๋•Œ X์— ๋“ค์–ด๊ฐˆ์ˆ˜์žˆ๋Š”๊ฐ’์€ 1๋ฟ (101)์ด๊ณ , 19X๋ผ๊ณ  ํ•œ๋‹ค๋ฉด X์— ๋“ค์–ด๊ฐˆ์ˆ˜์žˆ๋Š”๊ฐ’์€ 8๋ฟ(198) ์ธ ๊ฒƒ์ด๋‹ค. 0๊ณผ 9์ด์™ธ์˜ 1~8๊นŒ์ง€๋Š” ์•ž๋’ค๋กœ +1, -1์„ ๊ฐ€์งˆ์ˆ˜์žˆ๋‹ค.

์ด๋Ÿฌ๋ฉด ์ž๋ฆฟ๊ฐ’์€ 0~9๋ฅผ ๊ฐ€์งˆ์ˆ˜ ์žˆ๊ณ , N๊ฐœ์˜ ์ž๋ฆฟ๊ฐ’์„ ํ‘œํ˜„ํ•ด์•ผํ•˜๋ฏ€๋กœ 2์ฐจ์›๋ฐฐ์—ด์ด ํ•„์š”ํ•˜๋‹ค.

Long[][] dp = new Long[n+1][10]; // dp [n์ž๋ฆฌ์ˆ˜][์ž๋ฆฟ๊ฐ’]

 

์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ฌธ์ œ์— ์ ์šฉํ•˜์—ฌ ๋ณด์ž. ์ ํ™”์‹์„ ๊ทธ๋Œ€๋กœ ์ ์šฉํ•˜์—ฌ, ์žฌ๊ท€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ’€๊ฒƒ์ด๋‹ค. ์žฌ๊ท€๋ฅผ ์œ„ํ•ด ์ž๋ฆฟ์ˆ˜์„ ํ‘œํ˜„ํ•  digit , ์ž๋ฆฟ๊ฐ’์„ ํ‘œํ˜„ํ•  val ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

*
 digit ๋Š” ์ž๋ฆฟ์ˆ˜, val์€ ์ž๋ฆฟ๊ฐ’์„ ์˜๋ฏธํ•จ

 ์ฒซ์งธ ์ž๋ฆฌ์ˆ˜๋Š” ๊ฐ val์ด ๋์ด๊ธฐ ๋•Œ๋ฌธ์—
 ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 1๋ฐ–์— ์—†๋‹ค. ์ฆ‰, dp[1]์˜ ๊ฐ ์ž๋ฆฟ๊ฐ’์€
 1๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด์žˆ์–ด์•ผํ•œ๋‹ค.
*/

static long recur(int digit, int val) {        

    // ์ฒซ์งธ ์ž๋ฆฌ์ˆ˜์— ๋„์ฐฉํ•œ๋‹ค๋ฉด ๋”์ด์ƒ ํƒ์ƒ‰ํ•  ํ•„์š” ์—†์Œ
    if(digit == 1) {
        return dp[digit][val];
    }

    // ํ•ด๋‹น ์ž๋ฆฌ์ˆ˜์˜ val๊ฐ’์— ๋Œ€ํ•ด ํƒ์ƒ‰ํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ 
    if(dp[digit][val] == null) {
        // val์ด 0์ผ๊ฒฝ์šฐ ์ด์ „ ์ž๋ฆฌ๋Š” 1๋ฐ–์— ๋ชป์˜ด
        if(val == 0) {
            dp[digit][val] = recur(digit - 1 ,1);
        }
        // val์ด 9์ผ๊ฒฝ์šฐ ์ด์ „์€ 8๋ฐ–์— ๋ชป์˜ด
        else if(val== 9) {
            dp[digit][val] = recur(digit - 1, 8);
        }
        // ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ๋Š” val-1๊ณผ val+1 ๊ฐ’์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ•ฉํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋จ
        else {
            dp[digit][val] = recur(digit - 1, val - 1) + recur(digit - 1, val + 1);
        }
    }
    return dp[digit][val];
}

์ฝ”๋“œ

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

import java.util.Scanner;  

public class ์‰ฌ์šด๊ณ„๋‹จ์ˆ˜ {  

    static Long[][] dp;  
    static int n;  
    final static long MOD = 1_000_000_000;  

    public static void main(String[] args) {  

        Scanner sc = new Scanner(System.in);  

        n = sc.nextInt();  

        dp = new Long[n+1][10];  

        for(int i=0; i<10; i++){  
            dp[1][i] = 1L;  
        }  

        long result = 0;  

        for(int i=1; i<=9; i++){  
            result += recur(n,i);  
        }  

        System.out.println(result % MOD);  
        sc.close();
    }  

    /*  
     dist ๋Š” ์ž๋ฆฟ์ˆ˜, val์€ ์ž๋ฆฟ๊ฐ’์„ ์˜๋ฏธํ•จ  

     ์ฒซ์งธ ์ž๋ฆฌ์ˆ˜๋Š” ๊ฐ val์ด ๋์ด๊ธฐ ๋•Œ๋ฌธ์—  
     ๊ฒฝ์šฐ์˜ ์ˆ˜๋Š” 1๋ฐ–์— ์—†๋‹ค. ์ฆ‰, dp[1]์˜ ๊ฐ ์ž๋ฆฟ๊ฐ’์€  
     1๋กœ ์ดˆ๊ธฐํ™” ๋˜์–ด์žˆ์–ด์•ผํ•œ๋‹ค.  
    */  
    static long recur(int digit, int val) {  

        // ์ฒซ์งธ ์ž๋ฆฌ์ˆ˜์— ๋„์ฐฉํ•œ๋‹ค๋ฉด ๋”์ด์ƒ ํƒ์ƒ‰ํ•  ํ•„์š” ์—†์Œ  
        if(digit == 1) {  
            return dp[digit][val];  
        }  

        // ํ•ด๋‹น ์ž๋ฆฌ์ˆ˜์˜ val๊ฐ’์— ๋Œ€ํ•ด ํƒ์ƒ‰ํ•˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ  
        if(dp[digit][val] == null) {  
            // val์ด 0์ผ๊ฒฝ์šฐ ์ด์ „ ์ž๋ฆฌ๋Š” 1๋ฐ–์— ๋ชป์˜ด  
            if(val == 0) {  
                dp[digit][val] = recur(digit - 1 ,1);  
            }  
            // val์ด 9์ผ๊ฒฝ์šฐ ์ด์ „์€ 8๋ฐ–์— ๋ชป์˜ด  
            else if(val== 9) {  
                dp[digit][val] = recur(digit - 1, 8);  
            }  
            // ๊ทธ ์™ธ์˜ ๊ฒฝ์šฐ๋Š” val-1๊ณผ val+1 ๊ฐ’์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ํ•ฉํ•œ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ๋จ  
            else {  
                dp[digit][val] = recur(digit - 1, val - 1) + recur(digit - 1, val + 1);  
            }  
        }  
        return dp[digit][val] % MOD;  
    }  

}
๋ฐ˜์‘ํ˜•