
소스코드:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;
public class Main {
static BufferedReader br;
static BufferedWriter bw;
public static void main(String[] args) throws IOException {
br = new BufferedReader(new InputStreamReader(System.in));
bw = new BufferedWriter(new OutputStreamWriter(System.out));
int size = Integer.parseInt(br.readLine());
int[][] board = new int[size + 1][size + 1];
for (int y = 1; y <= size; y++) {
StringTokenizer st = new StringTokenizer(br.readLine());
for (int x = 1; x <= size; x++) {
board[y][x] = Integer.parseInt(st.nextToken());
}
}
int[][][] dp = new int[size + 1][size + 1][3];
// 0 가로 1 세로 2 대각선
dp[1][2][0] = 1;
for (int y = 1; y <= size; y++) {
for (int x = 1; x <= size; x++) {
if (board[y][x] == 1) {
continue;
}
// 0 가로
if (x - 1 >= 1 && board[y][x] == 0 && board[y][x - 1] == 0) {
dp[y][x][0] += dp[y][x - 1][0] + dp[y][x - 1][2];
}
// 1 세로
if (y - 1 >= 1 && board[y][x] == 0 && board[y - 1][x] == 0) {
dp[y][x][1] += dp[y - 1][x][1] + dp[y - 1][x][2];
}
// 2 대각선
if (y - 1 >= 1 && x - 1 >= 1 &&
board[y][x] == 0 && board[y - 1][x] == 0 &&
board[y][x - 1] == 0 && board[y - 1][x - 1] == 0) {
dp[y][x][2] += dp[y - 1][x - 1][0] + dp[y - 1][x - 1][1] + dp[y - 1][x - 1][2];
}
}
}
bw.write(dp[size][size][0] + dp[size][size][1] + dp[size][size][2] + "\n");
br.close();
bw.close();
}
}
글의 내용 중 잘못된 점이나 수정이 필요한 부분, 혹은 궁금한 사항이 있다면 언제든 댓글로 남겨주시면 감사하겠습니다.
여러분의 피드백은 더 나은 글을 작성하는 데 큰 도움이 됩니다. 감사합니다.
'알고리즘 > 백준' 카테고리의 다른 글
| [JAVA-자바] 1504번: 특정한 최단 경로 (0) | 2025.05.02 |
|---|---|
| [JAVA-자바] 1043번: 거짓말 (0) | 2025.04.30 |
| [JAVA-자바] 15686번: 치킨 배달 (0) | 2025.04.25 |
| [JAVA-자바] 11003번: 최솟값 찾기 (0) | 2025.04.24 |
| [JAVA-자바] 13549번: 숨바꼭질 3 (0) | 2025.04.23 |