- Algorithm Problem
- Solving
- ์ฐ์์ผ๋ก 3์ผ์ด ๋๋ ๊ฒฝ์ฐ๋ ์๋ค.
- ์ค๋์ด ์ฐ์๋ ๋ง 2์ผ์ฐจ๋ผ๋ฉด, ํด๋น ๋ง์ ๊ทธ ์ ๋ 1์ผ์ฐจ์ธ ๊ฒฝ์ฐ์ ์์ ๊ฐ๋ค.
- ์ค๋์ด ๋ง 1์ผ์ฐจ๋ผ๋ฉด, ๋ค๋ฅธ ๋ ๋ง์ 1, 2์ผ์ฐจ์ ๊ฒฝ์ฐ์ ์์ ํฉ๊ณผ ๊ฐ๋ค.
- ์ํ ๊ฒฝ์ฐ๋ ๋ง์ง๋ง๋ ๊ธฐ์ค (3๊ฐ์ง ๋ง) * (1์ผ์ฐจ ์ธ์ง, 2์ผ์ฐจ์ธ์ง)์ 6๊ฐ์ง์ ์ดํฉ์ด๋ค.
- 1์ผ์ฐจ๋ฅผ ๋ฌด์์ 1/0์ผ๋ก ์ด๊ธฐํ ํ ์ ์๋ค. ๊ณ ์ ๋ 2, 3์ผ์ฐจ๋ฅผ ๊ณ ๋ คํด์ผํ๋ค.
์์ 1
5 3 -- day, ์ง์ ์ผ์
3 1 -- 3์ผ์ฐจ๋ 1๋ฒ ๋ง
1 1 -- 1์ผ์ฐจ๋ 1๋ฒ ๋ง
4 2 -- 4์ผ์ฐจ๋ 2๋ฒ ๋ง
x o x x o -- x : ๊ณ ์ o : ๋ณํ
1 2 1 2 1
1 2 1 2 2 -- ์ฐ์ 2์ผ์ฐจ์ธ ๊ฒฝ์ฐ
1 2 1 2 3
1 3 1 2 1
1 3 1 2 2 -- ์ฐ์ 2์ผ์ฐจ์ธ ๊ฒฝ์ฐ
1 3 1 2 3
์์ 1 result
1๋ฒ ๋ง : n/n 0/n 2/0 n/n 2/0 -- 4์ผ์ฐจ๊ฐ 2๋ก ๊ณ ์ ์ด์ด์ ์ฐ์ 1์ผ์ฐจ๋ง 2๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋ค.
2๋ฒ ๋ง : n/n 1/0 n/n 2/0 0/2 -- 4์ผ์ฐจ๊ฐ 2๋ก ๊ณ ์ ์ด์ด์ ์ฐ์ 2์ผ์ฐจ๋ง 2๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋ค.
3๋ฒ ๋ง : n/n 1/0 n/n n/n 2/0 -- 4์ผ์ฐจ๊ฐ 2๋ก ๊ณ ์ ์ด์ด์ ์ฐ์ 1์ผ์ฐจ๋ง 2๊ฐ์ง ๊ฒฝ์ฐ๊ฐ ์๋ค.
3์ผ์ด ๊ณ ์ ๋์ด์์ด, 2์ผ์ฐจ์ 5์ผ์ฐจ์ ๊ฒฝ์ฐ๋ง ํ์ธํ๋ฉด ๋๋ค. ํ๋ฃจ๋ก ์์ ๋ฅผ ๋ฐ๊ฟ์ ์๊ฐํด๋ณด์.
ํ ์คํธ ์์
5 1 -- 5์ผ์ค ํ๋ฃจ๋ง ์ง์ ๋ ๋ง, 2์ผ์ฐจ๋ง 1๋ฒ ๋ง
2 1
ํ ์คํธ ์์ result : 60
--------์ง์ --------------
1 : n/n 2/1 0/2 6/0 16/6
2 : n/n n/n 3/0 5/3 14/5
3 : n/n n/n 3/0 5/3 14/5
1์ผ์ฐจ๋ 2์ผ์ฐจ๊ฐ 1๋ฒ๋ง์ผ๋ก ์ ํด์ ธ ์๊ณ , 3์ผ์ฐจ๋ ์์ ํด์ ธ ์๊ธฐ ๋๋ฌธ์, 1์ผ์ฐจ๋ ์ธ๊ฐ์ง ๋ง ๋ชจ๋ 1/0์ผ๋ก ์์ฑ์ด ๊ฐ๋ฅํ๋ค. 1/0์ ์๋ฏธ๋ ํด๋น ๋ง์ด 1์ผ์ฐจ ์กฐ๊ฑด์ธ ๊ฒฝ์ฐ/2์ผ์ฐจ ์กฐ๊ฑด์ธ ๊ฒฝ์ฐ์ด๋ค. 3์ผ์ฐจ๊ฐ ๊ณ ์ ์ด ์๋๊ธฐ๋๋ฌธ์ 1/0์ผ๋ก ์ฑ์ธ ์ ์๋ค๋ ๊ฒ์ ๋ค์ ํ๋ฒ ์๊ฐํ์.
2์ผ์ฐจ์์๋ 1๋ฒ ๋ง์ด 1์ผ์ฐจ ๊ฒฝ๊ณผ์ธ ์๋ ๊ทธ ์ ๋ ๋ง์ด 2๋๋ 3๋ฒ ๋ง์ธ ๊ฒฝ์ฐ์ ํฉ์ด๊ธฐ ๋๋ฌธ์, 1+0+1+0 = 2 ์ด๋ค. 1๋ฒ ๋ง์ด 2์ผ ์ฐจ์ธ ๊ฒฝ์ฐ์ ์๋ ๊ทธ ์ ๋ ๋ง์ด 1์ผ๋ 1์ผ์ฐจ์ธ ๊ฒฝ์ฐ์ ์ 1๊ณผ ๊ฐ๋ค.
3์ผ์ฐจ๋ 1๋ฒ ๋ง์ด 1์ผ์ฐจ์ผ ๊ฒฝ์ฐ๋ 0์ด๋ค. ์ด๋ฏธ ์์ 2์ผ์ฐจ๊ฐ 1๋ฒ๋ง์ผ๋ก ์ ํด์ ธ ์๊ธฐ ๋๋ฌธ์ ๋ถ๊ฐ๋ฅํ๋ค. 1๋ฒ ๋ง์ด 2์ผ์ฐจ์ธ ๊ฒฝ์ฐ๋ ๊ทธ ์ ๋ 1๋ฒ๋ง์ด 1์ผ์ฐจ์ธ ๊ฒฝ์ฐ์ ๊ฐ์ 2์ด๋ค. 2๋ฒ๋ง๊ณผ 3๋ฒ ๋ง์ ๊ฐ๊ฐ 2์ผ์ฐจ ๋ง์ด 1๋ก ์ ํด์ ธ์๊ธฐ ๋๋ฌธ์ 2์ผ์ฐจ์ธ ๊ฒฝ์ฐ์ ์๋ 0 ์ด๊ณ , 1์ผ์ฐจ์ธ ๊ฒฝ์ฐ์ ์๋ ๊ทธ ์ ๋ ํด๋น ๋ง์ด ์๋ ๊ฒฝ์ฐ์ ์์ ์ดํฉ(1๋ฒ๋ง ๊ณ ์ ) 2+1 = 3์ด๋ค.
4์ผ์ฐจ๋ 1๋ฒ ๋ง์ผ ๊ฒฝ์ฐ์ ์๋ ๊ทธ ์ ๋ ์ 2, 3๋ฒ๋ง ๊ฒฝ์ฐ์ ์์ ์ดํฉ 3+0+3+0์ด๊ณ , 2์ผ์ฐจ์ธ ๊ฒฝ์ฐ์ ์๋ ๊ทธ ์ ๋ ์ 1์ผ์ฐจ์ธ ๊ฒฝ์ฐ์ ์ 0 ๊ณผ ๊ฐ๋ค. 2, 3๋ฒ ๋ง์ ๊ฐ๊ฐ 1์ผ์ฐจ์ ๊ฒฝ์ฐ์ ์๋ ๊ทธ ์ ๋ ํด๋น ๋ง์ด ์๋ ๊ฒฝ์ฐ์ ์ 0+2+3+0 = 5 ์ด๊ณ , 2์ผ์ฐจ์ธ ๊ฒฝ์ฐ์ ์๋ ๊ทธ์ ๋ 1์ผ์ฐจ์ธ ๊ฒฝ์ฐ์ ์ 3๊ณผ ๊ฐ๋ค.
5์ผ์ฐจ๋ 1๋ฒ ๋ง์ ๊ฒฝ์ฐ ๊ทธ ์ ๋ ์ 2, 3๋ฒ ๋ง์ ๊ฒฝ์ฐ์ ์ ์ดํฉ 5+3+5+3 = 16์ด๊ณ , 2์ผ์ฐจ์ธ ๊ฒฝ์ฐ์ ์๋ ๊ทธ์ ๋ 1์ผ์ฐจ์ธ ๊ฒฝ์ฐ์ ์ 6๊ณผ ๊ฐ๋ค. 2,3๋ฒ ๋ง์ ๊ฐ๊ฐ 1์ผ์ฐจ์ธ ๊ฒฝ์ฐ์ ์๋ ๊ทธ ์ ๋ ํด๋น ๋ง์ด ์๋ ๊ฒฝ์ฐ์ ์ ์ดํฉ 6+0+5+3 = 14์ด๊ณ , 2์ผ์ฐจ์ธ ๊ฒฝ์ฐ์ ์๋ ๊ทธ ์ ๋ ์ด 1์ผ์ฐจ์ธ ๊ฒฝ์ฐ์ ์ 5์ ๊ฐ๋ค.
์ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์ฌ๊ท๋ฌธ์ ๊ตฌ์ฑํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
private static int recur(int cur, int sel, int cnt) {
if (arr[cur] != -1 && arr[cur] != sel) // cur : ํ์ฌ์ผ์, sel : ์ ํ๋ ๋ง, cnt : ์ผ์ฐจ
return 0; // ๋ง์ด ์ ํด์ง ๋ ์ง์ธ๋ฐ, ํด๋น ๋ง์ด ์๋๊ฒฝ์ฐ๋ ๊ฒฝ์ฐ์ ์ ๋ณํ ์์
if (cur == 1) // N์ผ์ฐจ ๋ถํฐ ์์ํด์ 1์ผ์ฐจ๊น์ง ๋ด๋ ค์์ ๋,
return cnt == 0 ? 1 : 0; // cnt - 0 : 1์ผ์ฐจ ์ธ ๊ฒฝ์ฐ 1, 1 : 2์ผ์ฐจ์ธ ๊ฒฝ์ฐ๋ ๋ถ๊ฐ 0
if (dp[cur][sel][cnt] != null)
return dp[cur][sel][cnt]; // ์ด๋ฏธ ๊ณ์ฐ๋ ๊ฐ์ด๋ฉด ๋ฉ๋ชจ์ด์ ์ด์
์ผ๋ก ๋ฐํ
dp[cur][sel][cnt] = 0; // Integer๋ก ๋ฐฐ์ด์ ๋ง๋ค๋ฉด ์ด๊ธฐํ ์์ด null๋น๊ต๊ฐ ๊ฐ๋ฅํ๋ค.
int tmp = 0;
if (cnt == 0) { // ๋ฐฉ๋ฌธ ํ์ ๋ 1์ผ์ฐจ๋ผ๋ฉด, ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์๋
for (int i = 0; i < 3; i++) { // i๋ ์ ๋ ์ ํํ ๋ง
if (i == sel) // ํ์ฌ sel์ด 1์ผ์ฐจ์ด๊ธฐ ๋๋ฌธ์, ์ ๋ ๋ง์ด ๊ฐ์ ์ ์๋ค.
continue;
tmp = (tmp + recur(cur - 1, i, 0) + recur(cur - 1, i, 1)) % MOD;
} // ํด๋น ๋ง์ด 1์ผ์ฐจ ์ผ๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ์ ์๋ cur-1 ํ๋ฃจ์ ๋ ๋ค๋ฅธ ๋ง ๊ฒฝ์ฐ์ ์์ ์ดํฉ
} else
tmp = recur(cur - 1, sel, 0); // ํด๋น ๋ง์ด 2์ผ์ฐจ๋ฉด ์ ๋ 1์ผ์ฐจ(0)๊ณผ ๊ฒฝ์ฐ์ ์๊ฐ ๊ฐ๋ค.
return dp[cur][sel][cnt] = tmp; // ๋ฉ๋ชจ์ด์ ์ด์
}
์ค์ ์ฌํญ์ ํด๋น๋ง์ด 3์ผ ์ฐ์ ๋ถ๊ฐ๋ฅ ํ๊ธฐ ๋๋ฌธ์ 1,2์ผ์ฐจ ์ฌ๋ถ ์ 3๊ฐ์ง ๋ง์ ๊ณฑํ ์ด 6๋ฒ์ ์ํ๋ฅผ ์์ผ์ผ ํ๋ฉฐ, ํ๋ฃจ์ฉ ๋ฆฌํํธ๋ฆฌ๋ก ์ด๋ํ๊ธฐ๋๋ฌธ์ ๋ฉ๋ชจ์ด์ ์ด์ ์ด ์๋ค๋ฉด 10ํ๋ง ๋ฐ๋ณตํด๋ ์๊ฐ์ด๊ณผ๊ฐ ๋ ๊ฒ์ด๋ค.
- Full Code
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class Day81BOJ5546ํ์คํ {
static final int MOD = 10_000;
static int N, K, ans;
static int[] arr;
static Integer[][][] dp;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = ip(st.nextToken());
K = ip(st.nextToken());
ans = 0;
arr = new int[N + 1];
Arrays.fill(arr, -1);
dp = new Integer[N + 1][3][2];
for (int i = 0; i < K; i++) {
st = new StringTokenizer(br.readLine());
arr[ip(st.nextToken())] = ip(st.nextToken()) - 1;
}
for (int i = 0; i < 3; i++) { // ๋ง
for (int j = 0; j < 2; j++) { // ์ฐ์
ans += recur(N, i, j);
// System.out.println("result : " + recur(N, i, j));
// print(dp);
}
}
System.out.println(ans % MOD);
br.close();
}
private static int recur(int cur, int sel, int cnt) {
if (arr[cur] != -1 && arr[cur] != sel)
return 0;
if (cur == 1)
return cnt == 0 ? 1 : 0;
if (dp[cur][sel][cnt] != null)
return dp[cur][sel][cnt];
dp[cur][sel][cnt] = 0;
int tmp = 0;
if (cnt == 0) {
for (int i = 0; i < 3; i++) {
if (i == sel)
continue;
tmp = (tmp + recur(cur - 1, i, 0) + recur(cur - 1, i, 1)) % MOD;
}
} else
tmp = recur(cur - 1, sel, 0);
return dp[cur][sel][cnt] = tmp;
}
static int ip(String s) { // ๊ธธ์ด
return Integer.parseInt(s);
}
private static void print(Integer[][][] a) {
StringBuilder tt = new StringBuilder();
for (int j = 0; j < 3; j++) {
tt.append(j + 1 + " : ");
for (int i = 1; i < N + 1; i++) {
String s = "";
tt.append(s = (a[i][j][0] + "/" + a[i][j][1]).replaceAll("ull", ""))
.append(s.length() > 2 ? " " : "\t");
}
tt.append("\n");
}
System.out.println(tt);
}
}
- Review
์ต๊ทผ์ ๊ณ์ DP๋ฌธ์ ์ ๋์ ํ๊ณ ์๋ค. ๋ ์์ ์ ํ์ ๊ฐ์ง๊ณ ์ ์ฒด ๊ฒฝ์ฐ์ ์๋ฅผ ์ง์ ์ฐ๋ ์์ ๊ณผ ์ ํ์์ ์ํด ๋์ ํฉ์ผ๋ก ์์๊ฐ๋ฉด์ DP๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ์ง ์๊ฐํด๋ด์ผํ๋ค. 2์ฐจ์ ๋ฐฐ์ด๋ก๋ง ๊ตฌ์ฑ์ ํ๋ค๊ฐ 1๊ฐ์ง ๋ ์๊ฐ์ ์น์ด์ผ ํ๊ฒ๋๋ ์๊ฐ๋ ๋ฐฐ๋ก ๋ค์ด๊ฐ๋ ๋๋์ด๋ค. ๋ฐ๋์ ์์ผ๋ก ์ฐ๋ ์์ ์ ๊ฒ์๋ฆฌ ํ์ง ๋ง์. ๋ชธ์ด ๋์๋ฉด ๋จธ๋ฆฌ๊ฐ ๊ณ ์ํ๋ค.
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 17966๋ฒ : Graph and Cycles - JAVA[์๋ฐ] (0) | 2022.04.27 |
---|