Notion์ ์ ๋ฆฌํ ๊ธ์ ์ฎ๊ธด ๊ฒ์ ๋๋ค.
1563๋ฒ: ๊ฐ๊ทผ์
๋ฐฑ์ค์คํ๊ต์์๋ ํ๊ธฐ๊ฐ ๋๋ ๋ฌด๋ ต์ ์ถ๊ฒฐ์ฌํญ์ ๋ณด๊ณ ๊ฐ๊ทผ์์ ์ค ๊ฒ์ธ์ง ๋ง ๊ฒ์ธ์ง ๊ฒฐ์ ํ๋ค. ์ด ํ๊ต๋ ์ด์ํด์ ํ์๋ค์ด ํ๊ต๋ฅผ ๋๋ฌด ์์ฃผ ๋น ์ง๊ธฐ ๋๋ฌธ์, ๊ฐ๊ทผ์์ ์ฃผ๋ ์กฐ๊ฑด์ด ์กฐ๊ธ ๋
www.acmicpc.net
๋ฌธ์
ํ์ด
์์ ํ์์ ์ด์ฉํด์ผํ์ง๋ง, ์์ ํ์๋ง ์ฌ์ฉํ๋ค๋ฉด ๊ฒฝ์ฐ์ ์๊ฐ O(3^1000)์ ์๊ฐ๋ณต์ก๋๊ฐ ๋ฐ์ํ๋ค.
๊ทธ๋์ ์ฌ๊ท์ ์ ๊ทผ(DFS) + dp ⇒ dp์ bottom-up๋ฐฉ์์ ์ฌ์ฉํ์ฌ ํ์๋ค.
์ด ๋ฌธ์ ์ ํต์ฌ์ ์ ํ์์ ์ฐพ๋ ๊ฒ์ธ๋ฐ, ๊ฐ๋จํ ์๋ฅผ ํตํด ์์๋ณด์.
ํ ํ๊ธฐ๋ฅผ 3์ผ์ด๋ผ๊ณ ํ์.
์ง๊ฐ(late)๋ 2์ผ ์ด์์ด๋ฉด ์๋๊ณ , ๊ฒฐ์(absent)์ ์ฐ์ 3์ผ ์ด์์ด๋ฉด ์๋๋ค.
dp[idx][late][absent] 3์ฐจ์ ๋ฐฐ์ด์ ์์ฑํ๊ณ ,
idx๋ ํ์ฌ ์ผ ์, late๋ ์ง๊ฐ ์ผ ์, absent๋ ๋งจ ๋ง์ง๋ง ์ธ๋ฑ์ค๋ถํฐ ์ฒดํฌํ ์ฐ์๋ ๊ฒฐ์ ์ผ ์๋ฅผ ๋ปํ๋ค.
๊ทธ๋ผ OA๋ dp๋ฐฐ์ด๋ก ๋ํ๋ด๋ฉด dp[2][0][1]์ด ๋๋ค.
๊ทธ๋ผ ์๊ฐํด๋ณด์. OA_์ _๋ ๋ญ๊ฐ ๋ค์ด๊ฐ ์ ์์๊น? ํ์ฌ๋ O, A, L ์ธ๊ฐ์ง ์ข ๋ฅ๊ฐ ๋ค ๊ฐ๋ฅํ๋ค.
OAL, OAA, OAO ์ธ๊ฐ์ง ์ผ์ด์ค๋ฅผ dp๋ฐฐ์ด๋ก ๋ํ๋ด๋ณด๋ฉด, dp[3][1][0], dp[3][0][2], dp[3][0][0]์ด๊ณ , OA์ ๊ฒฝ์ฐ๋ ์ด ์ธ๊ฐ์ง ์ผ์ด์ค๋ฅผ ํฉ์น ๊ฐ์ด ๋๋ค.
dp[2][0][1] = dp[3][1][0] + dp[3][0][2] + dp[3][0][0]
์ฌ๊ธฐ์ ๋ณด๋ฉด,
dp[idx][late][absent] = dp[idx+1][late+1][0] + dp[idx+1][late][absent+1] + dp[idx+1][late][0]
์ด๋ผ๋ ์ ํ์์ ์ป์ด๋ผ ์ ์๋ค.
ํ์ง๋ง ๋ฌธ์ ์์ , n์ด ๋ณ์์ด๊ณ , ์ฌ๊ท๋ฅผ ํตํด์ ๋ง์ง๋ง๊น์ง ๊น์ด ํ์์ ํ ํ ๊ทธ ๊ฐ๋ค์ ๋ชจ๋ ๋ํด์ฃผ๊ณ ๊ณ์ฐํด์ผ ํ๊ธฐ์, ์ ํ์์ ์๋์ ๊ฐ์ด ๋ณํ๋๋ค.
dp[idx][late][absent] += dfs(idx+1, late+1, 0) + dfs(idx+1, late, absent+1) + dfs(idx+1, late, 0)
๐ก์ฌ๊ธฐ์ dfs์ return ๊ฐ์ dp[idx][late][absent] % 1000000์(๋ฌธ์ ์์ 1,000,000์ผ๋ก ๋๋ ๋๋จธ์ง๋ฅผ ์ถ๋ ฅํ๋ผ ํ๊ธฐ ๋๋ฌธ)
์ตํ๋ก dfs(0,0,0)์ ์คํํ๋ฉด, dp[0][0][0]์ ๊ฒฐ๊ณผ ๊ฐ์ด ๋ฐํ ๋จ.
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main {
static int n;
static int dp[][][];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
dp = new int[n+1][2][3];
for(int i = 0; i < n; i++) {
for(int j = 0; j < 2; j++) {
Arrays.fill(dp[i][j], -1);
}
}
dfs(0,0,0);
System.out.println(dp[0][0][0]);
}
public static int dfs(int idx, int late, int absent) {
if(late == 2 || absent == 3) {
return 0;
}
if(idx == n) {
return 1;
}
if(dp[idx][late][absent] != -1) {
return dp[idx][late][absent];
}
dp[idx][late][absent] = 0; // ๋ฐฉ๋ฌธ๊ธฐ๋ก ์ ์ฅ
dp[idx][late][absent] += (dfs(idx+1, late+1, 0) + dfs(idx+1, late, absent+1)
+ dfs(idx+1, late, 0)) % 1000000;
return dp[idx][late][absent] % 1000000;
}
}
'Algorithm > BaekJoon' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์นด์ดํ ์ ๋ ฌ (Counting Sort) (0) | 2022.12.27 |
---|---|
[๋ฐฑ์ค] 1920๋ฒ : ์ ์ฐพ๊ธฐ - JAVA [์๋ฐ] ์ด๋ถ ํ์ ๋ฌธ์ (0) | 2021.10.25 |
[๋ฐฑ์ค] 1874๋ฒ : ์คํ ์์ด - JAVA [์๋ฐ] (0) | 2021.10.25 |
[๋ฐฑ์ค] 1654๋ฒ : ๋์ ์๋ฅด๊ธฐ - JAVA [์๋ฐ] (0) | 2021.10.25 |