Algorithm๐Ÿฅ‡

15988.123๋”ํ•˜๊ธฐ3

hae02y 2023. 11. 7. 15:03
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

์ •์ˆ˜ 4๋ฅผ 1, 2, 3์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•์€ ์ด 7๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค. ํ•ฉ์„ ๋‚˜ํƒ€๋‚ผ ๋•Œ๋Š” ์ˆ˜๋ฅผ 1๊ฐœ ์ด์ƒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

  • 1+1+1+1
  • 1+1+2
  • 1+2+1
  • 2+1+1
  • 2+2
  • 1+3
  • 3+1

์ •์ˆ˜ n์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, n์„ 1, 2, 3์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

## ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜ T๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ํ•œ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ , ์ •์ˆ˜ n์ด ์ฃผ์–ด์ง„๋‹ค. n์€ ์–‘์ˆ˜์ด๋ฉฐ 1,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.

## ์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋งˆ๋‹ค, n์„ 1, 2, 3์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐฉ๋ฒ•์˜ ์ˆ˜๋ฅผ 1,000,000,009๋กœ ๋‚˜๋ˆˆ ๋‚˜๋จธ์ง€๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

์‹œ๊ฐ„ ์ œํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์ œ์ถœ ์ •๋‹ต ๋งžํžŒ ์‚ฌ๋žŒ ์ •๋‹ต ๋น„์œจ
1 ์ดˆ (์ถ”๊ฐ€ ์‹œ๊ฐ„ ์—†์Œ) 512 MB 30097 10989 8392 34.724%

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

ํ’€์ด

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

n=1 ์ผ๋•Œ, 1

n=2 ์ผ๋•Œ, 1+1 2

n=3 ์ผ๋•Œ, 1+1+1 1+2 2+1 3

n=4 ์ผ๋•Œ, 1+1+1+1 / 1+1+2 / 1+2+1 / 2+1+1 / 2+2 / 1+3 / 3+1

n=4๋ฅผ ์ž์„ธํžˆ ๋“ค์—ฌ๋‹ค๋ณด๋ฉด 3์ผ๋•Œ์˜ ๋ฐฉ๋ฒ•์— +1์„ ํ•œ๊ฐ’๋“ค์ด ๋ณด์ด๊ณ , 2์ผ๋•Œ์˜ ๋ฐฉ๋ฒ•์— +2 ํ•œ ๊ฐ’๋“ค์ด ๋ณด์ด๊ณ , 1์ผ๋•Œ์˜ ๊ฐ’์— +3ํ•œ ๊ฐ’๋“ค์ด ๋ณด์ธ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ ํ™”์‹์„ ๊ตฌํ•˜๋ฉด

dp[n] = dp[n-1] + dp[n-2] + dp[n-3]

์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ์ด์ „์— ํ’€์—ˆ๋˜ ๋ฌธ์ œ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ํ‘ธ๋Š” ๊ฒƒ์ด๊ณ , ๋ฌธ์ œ๋ฅผ ๋ณด๋ฉด n์€ ์–‘์ˆ˜์ด๋ฉฐ 1,000,000๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™๋‹ค.์˜ ์กฐ๊ฑด์ด ์žˆ๋‹ค.

n์ด 1,000,000 ๊นŒ์ง€ ๋ฒ”์œ„๋ผ๋ฉด, dp์ ํ™”์‹์„ ์ฑ„์šฐ๋Š” ๋ง์…ˆ์„ ์ƒ๊ฐํ•ด๋ณด์ž.
ํ”ผ๋ณด๋‚˜์น˜๋ฅผ ๊ตฌํ• ๋•Œ n=47์ผ๋•Œ๋ถ€ํ„ฐ int์˜ ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•œ๋‹ค.
์ฆ‰, ๋‚˜๋จธ์ง€์—ฐ์‚ฐ์„ ํ•˜๊ธฐ์ „์˜ (dp[i-1] + dp[i-2] + dp[i-3]) ์˜ ๊ฐ’์ด 1000000009 x 1000000009 ๊ฐ€ ๋‚˜์˜ฌ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ long์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค.

์ฝ”๋“œ

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

import java.util.Scanner;  

public class _123๋”ํ•˜๊ธฐ3 {  

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

        int t = sc.nextInt();  

        long[] dp = new long[1_000_001];  

        //์ด์ „์— ํ’€์—ˆ๋˜ 123๋”ํ•˜๊ธฐ ๋ฌธ์ œ์™€ ๋™์ผํ•œ๋ฐ ๊ณ ๋ คํ• ์ ์ด ์žˆ๋‹ค.  
        //1. ์ œํ•œ ๋ฒ”์œ„๊ฐ€ ์ƒ๊น€. > ๋ชจ๋“ˆ๋Ÿฌ ์—ฐ์‚ฐ.  
        //n์ด 1,000,000 ๊นŒ์ง€ ๋ฒ”์œ„๋ผ๋ฉด, dp์ ํ™”์‹์„ ์ฑ„์šฐ๋Š” ๋ง์…ˆ์„ ์ƒ๊ฐํ•ด๋ณด์ž.  
        //ํ”ผ๋ณด๋‚˜์น˜๋ฅผ ๊ตฌํ• ๋•Œ n=47์ผ๋•Œ๋ถ€ํ„ฐ int์˜ ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•œ๋‹ค.  
        //์ฆ‰, ๋‚˜๋จธ์ง€์—ฐ์‚ฐ์„ ํ•˜๊ธฐ์ „์˜ (dp[i-1] + dp[i-2] + dp[i-3]) ์˜ ๊ฐ’์ด 1000000009 x 1000000009 ๊ฐ€ ๋‚˜์˜ฌ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ  
        //long์œผ๋กœ ํ•ด๊ฒฐํ•œ๋‹ค.  

        dp[1] = 1;  
        dp[2] = 2;  
        dp[3] = 4;  

        for(int i=4; i<dp.length; i++){  
            dp[i] = (dp[i-1] + dp[i-2] + dp[i-3]) % 1_000_000_009;  
        }  

        for(int i=0; i<t; i++){  
            int n = sc.nextInt();  
            System.out.println(dp[n]);  
        }  
        sc.close();  
    }  
}
๋ฐ˜์‘ํ˜•