Algorithm๐Ÿฅ‡

15990.123๋”ํ•˜๊ธฐ5

hae02y 2023. 11. 1. 00:51
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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

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

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

## ์ž…๋ ฅ

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

## ์ถœ๋ ฅ

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

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

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

ํ’€์ด

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

์ด๋ฌธ์ œ๋กœ ํ•œ์ฐธ์„ ๊ณ ๋ฏผํ–ˆ๋‹ค... dp๋ฅผ ์‚ฌ์šฉํ•ด์„œ 1์ฐจ์› ๋ฐฐ์—ด์„ ๋งŒ๋“ค๊ณ  ์•„๋ฌด๋ฆฌ ์ƒ๊ฐ์„ ํ•ด๋ด๋„ ์•ˆํ’€๋ฆฌ๋Š” ๊ฒƒ์ด๋‹ค. ๋‚ด๊ฐ€ ๊ณ ๋ฏผ์„ ํ•˜๋‹ค๊ฐ€ ์•ˆํ’€๋ ธ๋˜ ๋ถ€๋ถ„์ด ๋งŒ์•ฝ 3์ผ ๊ฒฝ์šฐ 1+1+1, 1+2, 3 ์ด๋ ‡๊ฒŒ 3๊ฐ€์ง€์˜ ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธฐ๊ณ , ์ œ์ผ ๋’ท์ž๋ฆฌ๊ฐ€ 1์ผ๋•Œ, 2์ผ๋•Œ, 3์ผ๋•Œ๋ฅผ ๊ตฌ๋ถ„์ง€์–ด์ฃผ๋Š” ๋ถ€๋ถ„์„ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ์ง€ ๋„์ €ํžˆ ๊ฐ์ด ์•ˆ์™”๋‹ค. ๊ทธ๋ž˜์„œ ์ฐพ์•„๋ณด๋‹ˆ... ์˜ค๋งˆ๊ฐ“ ์ง„์งœ ์‚ฌ๋žŒ๋“ค ๋˜‘๋˜‘ํ•ด๐Ÿ˜‚

์ž๊ทธ๋Ÿผ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์ž!

์ด๋ฌธ์ œ๋Š” ์ผ๋‹จ DP์™€ 2์ฐจ์› ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

DP ๋ฌธ์ œ์ด๋ฏ€๋กœ ๋จผ์ € ๊ณตํ†ต์ ์„ ์ฐพ์•„ ๋‚ด๋Š”๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ๋ฌธ์ œ๋ฅผ ์ž‘์€ ๋‹จ์œ„๋ถ€ํ„ฐ ์ฒœ์ฒœํžˆ ํ›‘์–ด ๋ณด์•˜๋‹ค.

1 > 1
2 > 1+1, 2
3 > 1+1+1, 2+1, 1+2, 3
4 > (1+1+1+1, 2+1+1, 1+2+1, 3+1), (1+1+2, 2+2), (1+3)

์ด์ •๋„๋ฉด ์ด์ œ ์–ด๋Š์ •๋„ ๊ณตํ†ต์ ์ด ๋ณด์—ฌ์•ผํ•œ๋‹ค.

  • 4๋ฅผ ๋งŒ๋“ค๋•Œ, 3์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ +1
  • 4๋ฅผ ๋งŒ๋“ค๋•Œ, 2๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ +2
  • 4๋ฅผ ๋งŒ๋“ค๋•Œ, 1์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ +3
    (์—ฌ๊ธฐ์—์„œ 2๋ฒˆ์ด์ƒ ์ค‘๋ณต๋˜๋Š” ๋ถ€๋ถ„์„ ์ œ๊ฑฐํ•˜๊ณ  dp์— ๊ธฐ๋กํ•˜๋ฉด ๋˜๊ฒ ๊ตฌ๋‚˜.)

์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ dp๋ฅผ ๋‚˜ํƒ€๋‚ด๋ณด๋ฉด,

dp[i][j]    // i: ์ž„์˜์˜ ์ •์ˆ˜, j: ๋ง์…ˆ์ด j๋กœ ๋๋‚จ

์ด๋ ‡๊ฒŒ ๋ณด๋ฉด ๋˜๊ฒ ๋‹ค. ๊ทธ๋Ÿผ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด๋ณด์ž.

3์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ

  • 1+1+1 => dp[3][1] = 1
  • 1+2 => dp[3][2] = 1
  • 2+1 => dp[3][1] = 1
  • 3 => dp[3][3] = 1

5๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ

5๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ๋ฅผ ์ž์„ธํ•˜๊ฒŒ ์•Œ์•„๋ณด์ž.

5๋ฅผ 1, 2 ,3 ์˜ ํ•ฉ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๋ณด์ž.
2๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์— 3์„ ๋”ํ•˜๊ณ ,
3์„ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์— 2๋ฅผ ๋”ํ•˜๊ณ ,
4๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒฝ์šฐ์— 1์„ ๋”ํ•˜๋ฉด 5๊ฐ€ ๋ ๊ฒƒ์ด๋‹ค.
(์ด๋•Œ ๊ฐ™์€ ์ˆ˜๋ฅผ 2๋ฒˆ ์—ฐ์†์œผ๋กœ ์‚ฌ์šฉํ• ์ˆ˜๋Š” ์—†๋‹ค. ์ฆ‰, ์ด์ „์— ์‚ฌ์šฉํ•œ ๊ฐ’์€ ์ œ๊ฑฐํ•œ๋‹ค.)

1) 5๋ฅผ ๋งŒ๋“œ๋Š” ์ˆ˜์‹์ค‘์—
1๋กœ ๋๋‚˜๋Š” ์ˆ˜์‹(๋งˆ์ง€๋ง‰์— 1์„ ๋”ํ•ด์ฃผ๋Š” ๊ฒฝ์šฐ)์€
4๋ฅผ ๋งŒ๋“œ๋Š” ์ˆ˜์‹์—์„œ 2๋กœ ๋๋‚˜๋Š” ๊ฒƒ์— 1๋ฅผ ๋”ํ•˜๋Š”๊ฒƒ,
4๋ฅผ ๋งŒ๋“œ๋Š” ์ˆ˜์‹์ค‘์—์„œ 3์œผ๋กœ ๋๋‚˜๋Š” ๊ฒƒ์— 1์„ ๋”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
(๊ฐ™์€ ์ˆ˜ ์—ฐ์† 2๋ฒˆ์€ ์•ˆ๋˜๊ธฐ ๋•Œ๋ฌธ์— 1๋กœ ๋๋‚˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•œ๋‹ค.)
์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

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

// ์ด๊ฒƒ์„ ์ผ๋ฐ˜ํ™” ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

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

2) 2๋ฅผ ๋”ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž
๋งˆ์ง€๋ง‰์— 2๋ฅผ ๋”ํ•ด์ฃผ๋Š” ๊ฒฝ์šฐ๋Š”,
3์„ ๋งŒ๋“œ๋Š” ์ˆ˜์‹์—์„œ 1๋กœ ๋๋‚˜๋Š” ๊ฒƒ์— 2๋ฅผ ๋”ํ•˜๋Š”๊ฒƒ,
3์„ ๋งŒ๋“œ๋Š” ์ˆ˜์‹์—์„œ 3์œผ๋กœ ๋๋‚˜๋Š” ๊ฒƒ์— 2๋ฅผ ๋”ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
(์ด๊ฒƒ ๋˜ํ•œ ๊ฐ™์€ ์ˆ˜๋ฅผ ์—ฐ์†์œผ๋กœํ•˜๋ฉด ์•ˆ๋˜๋ฏ€๋กœ 2๋กœ ๋๋‚˜๋Š” ๊ฒƒ์€ ์ œ์™ธ ๋œ๋‹ค.)

dp[5][2] = dp[3][1] + dp[3][3];

// ์ด๊ฒƒ์„ ์ผ๋ฐ˜ํ™” ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

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

3) 3์„ ๋”ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ์‚ดํŽด๋ณด์ž
๋งˆ์ง€๋ง‰์— 3์„ ๋”ํ•ด์ฃผ๋Š” ๊ฒฝ์šฐ๋Š”,
2๋ฅผ ๋งŒ๋“œ๋Š” ์ˆ˜์‹์—์„œ 1๋กœ ๋๋‚˜๋Š” ๊ฒƒ์— 3์„ ๋”ํ•˜๋Š”๊ฒƒ,
2๋ฅผ ๋งŒ๋“œ๋Š” ์ˆ˜์‹์—์„œ 2๋กœ ๋๋‚˜๋Š” ๊ฒƒ์— 3์„ ๋”ํ•˜๋Š”๊ฒƒ์ด๋‹ค.
(์ด๊ฒƒ๋„ ๊ฐ™์€ ์ˆ˜๋ฅผ ์—ฐ์†์œผ๋กœ ๋‚˜์—ดํ• ์ˆ˜์—†์œผ๋ฏ€๋กœ 3์œผ๋กœ ๋๋‚˜๋Š” ๊ฒƒ์€ ์ œ๊ฑฐํ•œ๋‹ค.)

dp[5][3] = dp[2][1] + dp[2][2];

// ์ด๊ฒƒ์„ ์ผ๋ฐ˜ํ™” ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

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

์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ํ†ตํ•ด ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ ํ™”์‹์„ ๋„์ถœํ•ด ๋‚ผ์ˆ˜์žˆ๋‹ค.

dp[i][1] = (dp[i-1][2] + dp[i-1][3]) % 1_000_000_009;  
dp[i][2] = (dp[i-2][1] + dp[i-2][3]) % 1_000_000_009;  
dp[i][3] = (dp[i-3][1] + dp[i-3][2]) % 1_000_000_009; (n >= 4)

์ ํ™”์‹์—์„œ ๋ชจ๋“ˆ๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ 
10์–ต9๋กœ ๋‚˜๋ˆ ์„œ ์ถœ๋ ฅํ•˜๋ผ๋Š” ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ๋Š”๋ฐ, ๋งˆ์ง€๋ง‰์— ๋ชจ๋“ˆ๋Ÿฌ๋ฅผ ๋„ฃ๊ฒŒ๋˜๋ฉด ๊ฐ’์ด ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ๋˜์ง€์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ณ„์‚ฐ ๊ณผ์ • ์ค‘๊ฐ„์— ๋ชจ๋“ˆ๋Ÿฌ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.

์ฝ”๋“œ

import java.util.Scanner;  

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

    public static void main(String[] args) {  

        Scanner sc = new Scanner(System.in);  

        int t = sc.nextInt();  

        long[][] dp = new long[100001][4];  

        dp[1][1] = 1; // 1  
        dp[2][2] = 1; // 2  
        dp[3][1] = 1; // 2+1  
        dp[3][2] = 1; // 1+2  
        dp[3][3] = 1; // 3  

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

        for(int i=1; i<=t; i++){  
            int n = sc.nextInt();  
            System.out.println((dp[n][1] + dp[n][2] + dp[n][3]) % 1_000_000_009);  
        }  

        sc.close();  
    }  
}
๋ฐ˜์‘ํ˜•