[BOJ] 2011. ์•”ํ˜ธ์ฝ”๋“œ (๐Ÿฅ‡, DP)

lemythe423ยท2024๋…„ 3์›” 12์ผ
0

BOJ ๋ฌธ์ œํ’€์ด

๋ชฉ๋ก ๋ณด๊ธฐ
126/133
post-thumbnail

๐Ÿ”—

ํ’€์ด

n๊ธธ์ด์˜ ์•”ํ˜ธ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น ์•”ํ˜ธ์ฝ”๋“œ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ํ•ด์„์˜ ์ˆ˜๋Š” ์ด์ „์˜ ์•”ํ˜ธ์ฝ”๋“œ๋“ค์ด ๊ฐ€์ง€๋Š” ํ•ด์„์˜ ์ˆ˜๋ฅผ ํฌํ•จํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆผ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

๊ธธ์ด3์˜ ์•”ํ˜ธ์ฝ”๋“œ 123์€ (12, 3)๊ณผ (1, 23)์œผ๋กœ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ๋‹ค. ํ•ด์„ ๊ฐ€๋Šฅํ•œ ์•”ํ˜ธ๋Š” 1~26์‚ฌ์ด์˜ ์ˆซ์ž๋“ค์ด๊ธฐ ๋•Œ๋ฌธ์— 27์„ ๋„˜์–ด๊ฐ€๋Š” ์ˆ˜๋Š” ํ•ด์„ํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰ ์„ธ ์ž๋ฆฌ ์ด์ƒ์˜ ์ˆ˜๋“ค ์—ญ์‹œ ํ•ด์„์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŒ์•ฝ ๊ธธ์ด4์˜ ์•”ํ˜ธ์ฝ”๋“œ 1234๊ฐ€ ์žˆ๋‹ค๋ฉด (1, 234)์™€ ๊ฐ™์ด ๋‚˜๋ˆ ์„œ ํ•ด์„ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋•Œ๋ฌธ์— ์œ„์˜ ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋‹ค.

ํ•ด๋‹น ์ˆ˜๊ฐ€ ํ•ด์„ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์€ 1 ~ 26 ์‚ฌ์ด์˜ ์ˆซ์ž์—ฌ์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด ๋œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋•Œ n-1๋ฒˆ์งธ ์ˆ˜๊ฐ€ 0์ด๋ฉด 10*(n-1๋ฒˆ์งธ ์ˆ˜) + n๋ฒˆ์งธ ์ˆ˜์˜ ๊ณ„์‚ฐํ•ด์„œ 1 ~ 26 ์‚ฌ์ด์˜ ์ˆซ์ž๊ฐ€ ๋  ์ˆซ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” '02' ๋Š” '2'๋กœ ํ•ด์„๋  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์•ž์ž๋ฆฌ๊ฐ€ 0์ธ ๊ฒฝ์šฐ๋Š” ๋ฌด์กฐ๊ฑด ํ•ด์„์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

ํ•ด์„ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ํ•จ์ˆ˜๋Š” check1๊ณผ check2๋กœ ๊ฐ๊ฐ 1์ž๋ฆฌ ์ˆ˜, 2์ž๋ฆฌ ์ˆ˜์˜ ์ˆ˜๊ฐ€ ํ•ด์„ ๊ฐ€๋Šฅํ•œ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•˜๊ฒŒ ๋œ๋‹ค. ๊ฒฐ๊ตญ n๋ฒˆ์งธ์˜ 1์ž๋ฆฌ์ˆ˜๊ฐ€ ํ•ด์„์ด ๊ฐ€๋Šฅํ•˜๋ฉด dp[n-1]๋ฒˆ์งธ ์ˆ˜์˜ ํ•ด์„ ๊ฐ€๋Šฅํ•œ ๊ฐ€์ง€์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋”ํ•  ์ˆ˜ ์žˆ๋‹ค. n-1๋ฒˆ์งธ์˜ ์ˆ˜์™€ n๋ฒˆ์งธ ์ˆ˜ 2์ž๋ฆฌ์ˆ˜๊ฐ€ ํ•ด์„์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋ฉด 2์ž๋ฆฌ์˜ ์ˆ˜๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ dp[n-2]๋ฒˆ์งธ ์ˆ˜์˜ ํ•ด์„ ๊ฐ€๋Šฅํ•œ ๊ฐ€์ง€์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ ํ™”์‹์„ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

dp[n] = dp[n-1] check1() + dp[n-2] check2()

import java.util.*;
import java.io.*;

public class Main {
    static final int DIVIDE = 1000000;
    static int check1(int a) {
        return 0 < a && a < 10 ? 1 : 0;
    }

    static int check2(int a, int b) {
        int tmp = 10 * a + b;
        return a != 0 && 1 <= tmp && tmp <= 26 ? 1 : 0;
    }

    static int solution(int n, int[] dp, int[] arr) {
        if (arr[0] == 0) return 0;
        if (n > 1) {
            dp[1] = check1(arr[1]) + check2(arr[0], arr[1]);
            
            for (int i = 2; i < n; i++) {
                dp[i] = dp[i-2] * check2(arr[i-1], arr[i]) + dp[i-1] * check1(arr[i]);
                dp[i] %= DIVIDE;
            }
        }

        return dp[n-1];
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split("");
        int[] arr = new int[input.length];
        for (int i = 0; i < input.length; i++) {
            arr[i] = Integer.parseInt(input[i]);
        }
        
        int[] dp = new int[input.length];
        dp[0] = 1;
        System.out.println(solution(arr.length, dp, arr));
    }
}
``
profile
์•„๋ฌด๋ง์ด๋‚˜ํ•˜๊ธฐ

0๊ฐœ์˜ ๋Œ“๊ธ€