From 92ea237aa13b6ea984ccaea5aa7d6181f0b16dd5 Mon Sep 17 00:00:00 2001 From: Jonghwan Lee <123362165+0224LJH@users.noreply.github.com> Date: Fri, 10 Oct 2025 17:38:02 +0900 Subject: [PATCH] =?UTF-8?q?[20251010]=20PGM=20/=20Lv3=20/=20=EC=82=B0=20?= =?UTF-8?q?=EB=AA=A8=EC=96=91=20=ED=83=80=EC=9D=BC=EB=A7=81=20/=20?= =?UTF-8?q?=EC=9D=B4=EC=A2=85=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...1 \355\203\200\354\235\274\353\247\201.md" | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 "0224LJH/202510/10 PGM \354\202\260 \353\252\250\354\226\221 \355\203\200\354\235\274\353\247\201.md" diff --git "a/0224LJH/202510/10 PGM \354\202\260 \353\252\250\354\226\221 \355\203\200\354\235\274\353\247\201.md" "b/0224LJH/202510/10 PGM \354\202\260 \353\252\250\354\226\221 \355\203\200\354\235\274\353\247\201.md" new file mode 100644 index 00000000..d09e23df --- /dev/null +++ "b/0224LJH/202510/10 PGM \354\202\260 \353\252\250\354\226\221 \355\203\200\354\235\274\353\247\201.md" @@ -0,0 +1,52 @@ +```java +import java.io.*; +import java.util.*; + +class Solution { + static int size; + static boolean[] hasTop; + static int[][] dp; + + static final int EMPTY = 0; + static final int LEFT = 1; + static final int TOP = 2; + static final int RIGHT = 3; + static final int REMAINDER = 10007; + + public int solution(int n, int[] tops) { + size = n; + hasTop = new boolean[n]; + dp = new int[size][4]; + + for (int i = 0; i < n; i++) hasTop[i] = tops[i] == 1; + + process(); + + + int answer = dp[size-1][EMPTY] + dp[size-1][LEFT] + dp[size-1][TOP] + dp[size-1][RIGHT] ; + answer %= REMAINDER; + return answer; + } + + private void process(){ + // i번칸의 경우의 수 + // dp[i][아무것도 안함]= dp[i-1][모든 경우] + // dp[i][왼쪽으로 뻗음] = dp[i-1][왼쪽으로 뻗음] + dp[i-1][위로뻗음] + dp[i-1][아무것도 안함] + // dp[i][위로 뻗음] = (top이 있음)? dp[i-1][모든 경우]: 0; + // dp[i][오른쪽으로 뻗음] = dp[i-1]모든 경우 + + dp[0][EMPTY] = 1; + dp[0][LEFT] = 1; + dp[0][RIGHT] = 1; + if (hasTop[0]) dp[0][TOP] = 1; + + for (int i = 1; i < size; i++){ + int sum = dp[i-1][EMPTY] + dp[i-1][TOP] + dp[i-1][LEFT] + dp[i-1][RIGHT]; + dp[i][EMPTY] = sum%REMAINDER; + dp[i][LEFT] = (sum-dp[i-1][RIGHT])%REMAINDER; + dp[i][RIGHT] = sum%REMAINDER; + if(hasTop[i]) dp[i][TOP] = sum%REMAINDER; + } + } +} +```