https://www.acmicpc.net/problem/17069
๋ฌธ์
์ ํ์ด๊ฐ ์ ์ง์ผ๋ก ์ด์ฌํ๋ค. ์ ์ง์ ํฌ๊ธฐ๋ N×N์ ๊ฒฉ์ํ์ผ๋ก ๋ํ๋ผ ์ ์๊ณ , 1×1ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ๊ฐ์ ์นธ์ (r, c)๋ก ๋ํ๋ผ ์ ์๋ค. ์ฌ๊ธฐ์ r์ ํ์ ๋ฒํธ, c๋ ์ด์ ๋ฒํธ์ด๊ณ , ํ๊ณผ ์ด์ ๋ฒํธ๋ 1๋ถํฐ ์์ํ๋ค. ๊ฐ๊ฐ์ ์นธ์ ๋น ์นธ์ด๊ฑฐ๋ ๋ฒฝ์ด๋ค.
์ค๋์ ์ง ์๋ฆฌ๋ฅผ ์ํด์ ํ์ดํ ํ๋๋ฅผ ์ฎ๊ธฐ๋ ค๊ณ ํ๋ค. ํ์ดํ๋ ์๋์ ๊ฐ์ ํํ์ด๊ณ , 2๊ฐ์ ์ฐ์๋ ์นธ์ ์ฐจ์งํ๋ ํฌ๊ธฐ์ด๋ค.
ํ์ดํ๋ ํ์ ์ํฌ ์ ์์ผ๋ฉฐ, ์๋์ ๊ฐ์ด 3๊ฐ์ง ๋ฐฉํฅ์ด ๊ฐ๋ฅํ๋ค.
ํ์ดํ๋ ๋งค์ฐ ๋ฌด๊ฒ๊ธฐ ๋๋ฌธ์, ์ ํ์ด๋ ํ์ดํ๋ฅผ ๋ฐ์ด์ ์ด๋์ํค๋ ค๊ณ ํ๋ค. ๋ฒฝ์๋ ์๋ก์ด ๋ฒฝ์ง๋ฅผ ๋ฐ๋๊ธฐ ๋๋ฌธ์, ํ์ดํ๊ฐ ๋ฒฝ์ ๊ธ์ผ๋ฉด ์ ๋๋ค. ์ฆ, ํ์ดํ๋ ํญ์ ๋น ์นธ๋ง ์ฐจ์งํด์ผ ํ๋ค.
ํ์ดํ๋ฅผ ๋ฐ ์ ์๋ ๋ฐฉํฅ์ ์ด 3๊ฐ์ง๊ฐ ์์ผ๋ฉฐ, →, โ, ↓ ๋ฐฉํฅ์ด๋ค. ํ์ดํ๋ ๋ฐ๋ฉด์ ํ์ ์ํฌ ์ ์๋ค. ํ์ ์ 45๋๋ง ํ์ ์ํฌ ์ ์์ผ๋ฉฐ, ๋ฏธ๋ ๋ฐฉํฅ์ ์ค๋ฅธ์ชฝ, ์๋, ๋๋ ์ค๋ฅธ์ชฝ ์๋ ๋๊ฐ์ ๋ฐฉํฅ์ด์ด์ผ ํ๋ค.
ํ์ดํ๊ฐ ๊ฐ๋ก๋ก ๋์ฌ์ง ๊ฒฝ์ฐ์ ๊ฐ๋ฅํ ์ด๋ ๋ฐฉ๋ฒ์ ์ด 2๊ฐ์ง, ์ธ๋ก๋ก ๋์ฌ์ง ๊ฒฝ์ฐ์๋ 2๊ฐ์ง, ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๋์ฌ์ง ๊ฒฝ์ฐ์๋ 3๊ฐ์ง๊ฐ ์๋ค.
์๋ ๊ทธ๋ฆผ์ ํ์ดํ๊ฐ ๋์ฌ์ง ๋ฐฉํฅ์ ๋ฐ๋ผ์ ์ด๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ ๋ํ๋ธ ๊ฒ์ด๊ณ , ๊ผญ ๋น ์นธ์ด์ด์ผ ํ๋ ๊ณณ์ ์์ผ๋ก ํ์๋์ด์ ธ ์๋ค.
๊ฐ์ฅ ์ฒ์์ ํ์ดํ๋ (1, 1)์ (1, 2)๋ฅผ ์ฐจ์งํ๊ณ ์๊ณ , ๋ฐฉํฅ์ ๊ฐ๋ก์ด๋ค. ํ์ดํ์ ํ์ชฝ ๋์ (N, N)๋ก ์ด๋์ํค๋ ๋ฐฉ๋ฒ์ ๊ฐ์๋ฅผ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ง์ ํฌ๊ธฐ N(3 ≤ N ≤ 32)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ง์ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. ๋น ์นธ์ 0, ๋ฒฝ์ 1๋ก ์ฃผ์ด์ง๋ค. (1, 1)๊ณผ (1, 2)๋ ํญ์ ๋น ์นธ์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํ์ดํ์ ํ์ชฝ ๋์ (N, N)์ผ๋ก ์ด๋์ํค๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๋์ํฌ ์ ์๋ ๊ฒฝ์ฐ์๋ 0์ ์ถ๋ ฅํ๋ค.
ํ์ด
Dynamic Programming ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํ์๋ค.
DP[i][j][k] โก๏ธ (i, j) ์์น์ k ๋ฐฉํฅ์ผ๋ก ํ์ดํ๊ฐ ๋์ฐฉํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ ์ฅํ ๋ณ์
k๋ 0 : ๊ฐ๋ก, 1 : ์ธ๋ก, 2 : ๋๊ฐ์ ๋ฐฉํฅ์ด๋ค.
์ฐ์ ๊ฐ๋ก์ ์ธ๋ก๋ฅผ ๋ณด๋ฉด
๐ ๊ฐ๋ก๋ ๊ฐ๋ก๋ฐฉํฅ์์, ๋๊ฐ์ ๋ฐฉํฅ์์๋ง ๊ฐ๋ฅํ๊ณ , ์ธ๋ก๋ ์ธ๋ก๋ฐฉํฅ์์, ๋๊ฐ์ ๋ฐฉํฅ์์๋ง ๊ฐ๋ฅํ๋ค.
์ฆ DP[i][j][0]์ (i, j)์ ๊ฐ๋ก๋ก ๋์ฐฉํ๋ ๊ฒ์ ์๋ฏธํ๋ฏ๋ก, (i-1, j)์์ ์ด๋ํ๋ค. ์ฌ๊ธฐ์ ์ต๋ 45๋๋ง ํ์ ๊ฐ๋ฅํ๋ฏ๋ก (i-1, j)์์ธ๋ก๋ก ๋์ฐฉํ ํ์๋ ๋ํด์ฃผ์ง์๋๋ค.
์ ํ์์ ์ธ์ฐ๋ฉดโผ๏ธ
- DP[i][j][0] = DP[i-1][j][0] + DP[i-1][j][2]
- DP[i][j][1] = DP[i][j-1][1] + DP[i][j-1][2]
๐ ๋๊ฐ์ ์ ๊ฐ๋ก, ์ธ๋ก, ๋๊ฐ์ ๋ชจ๋ ๊ฐ๋ฅํ๋ค. ๊ทธ๋ฌ๋ ์ฃผ์ํ ์ โผ๏ธ(i-1, j) & (i, j-1)์ด ๋ฒฝ์ด์ฌ์๋ ์๋๋ค.
์ ํ์์ ์ธ์ฐ๋ฉด โผ๏ธ
- DP[i][j][0] = DP[i-1][j-1][0] + DP[i-1][j-1][1] + DP[i-1][j-1][2]
์ต์ข ์ ์ธ ๋ต์ผ๋ก, DP[N][N][0] + DP[N][N][1] + DP[N][N][2] ์ด๋ค.
์ฝ๋
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main_BOJ_17069_ํ์ดํ์ฎ๊ธฐ๊ธฐ2 {
static int[][] house;
static long[][][] DP;
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer;
int n = Integer.parseInt(br.readLine());
house = new int[n+1][n+1];
// 0 : ๊ฐ๋ก, 1 : ์ธ๋ก, 2 : ๋๊ฐ์
DP = new long[n+1][n+1][3];
for(int i = 1 ; i <= n ; i++){
stringTokenizer = new StringTokenizer(br.readLine());
for(int j = 1 ; j <= n ; j++){
house[i][j] = Integer.parseInt(stringTokenizer.nextToken());
}
}
DP[1][2][0] = 1;
for(int i = 1; i <= n ; i++){
for(int j = 3 ; j <= n ; j++){
if(house[i][j] == 1)
continue;
DP[i][j][0] = DP[i][j-1][0] + DP[i][j-1][2];
DP[i][j][1] = DP[i-1][j][1] + DP[i-1][j][2];
if(house[i-1][j] == 0 && house[i][j-1] == 0)
DP[i][j][2] = DP[i-1][j-1][0] + DP[i-1][j-1][1] + DP[i-1][j-1][2];
}
}
System.out.println(DP[n][n][0] + DP[n][n][1] + DP[n][n][2]);
}
}
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค / BOJ 18427] ํจ๊ป ๋ธ๋ก ์๊ธฐ (0) | 2021.09.14 |
---|---|
[๋ฐฑ์ค / BOJ 2109] ์ํ๊ฐ์ฐ (0) | 2021.09.14 |
[๋ฐฑ์ค / BOJ 2026] ์ํ (0) | 2021.09.14 |
[๋ฐฑ์ค / BOJ 20056] ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด๋ณผ (0) | 2021.09.14 |
[๋ฐฑ์ค / BOJ 12782] ๋นํธ ์ฐ์ ์ง์ (0) | 2021.09.14 |