fee-fi-fo-fum
๋ฐ˜์‘ํ˜•

1. ๋ฌธ์ œ

์ •์ˆ˜ 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

2. ํ’€์ด

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

์ด๋ฌธ์ œ๋กœ ํ•œ์ฐธ์„ ๊ณ ๋ฏผํ–ˆ๋‹ค... 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๋ฅผ ๋‚˜ํƒ€๋‚ด๋ณด๋ฉด,

<code />
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๋กœ ๋๋‚˜๋Š” ๊ฒƒ์„ ์ œ์™ธํ•œ๋‹ค.)
์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

<code />
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๋กœ ๋๋‚˜๋Š” ๊ฒƒ์€ ์ œ์™ธ ๋œ๋‹ค.)

<code />
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์œผ๋กœ ๋๋‚˜๋Š” ๊ฒƒ์€ ์ œ๊ฑฐํ•œ๋‹ค.)

<code />
dp[5][3] = dp[2][1] + dp[2][2]; // ์ด๊ฒƒ์„ ์ผ๋ฐ˜ํ™” ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค. dp[n][3] = dp[n-3][1] + dp[n-3][2];

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

<code />
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๋กœ ๋‚˜๋ˆ ์„œ ์ถœ๋ ฅํ•˜๋ผ๋Š” ์ œํ•œ ์‚ฌํ•ญ์ด ์žˆ๋Š”๋ฐ, ๋งˆ์ง€๋ง‰์— ๋ชจ๋“ˆ๋Ÿฌ๋ฅผ ๋„ฃ๊ฒŒ๋˜๋ฉด ๊ฐ’์ด ์ •์ƒ์ ์œผ๋กœ ์ถœ๋ ฅ๋˜์ง€์•Š๋Š”๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ๊ณ„์‚ฐ ๊ณผ์ • ์ค‘๊ฐ„์— ๋ชจ๋“ˆ๋Ÿฌ๋ฅผ ์‚ฝ์ž…ํ•œ๋‹ค.

2.2. ์ฝ”๋“œ

<code />
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(); } }
๋ฐ˜์‘ํ˜•
profile

fee-fi-fo-fum

@hae02y

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!