https://www.acmicpc.net/problem/2411
ํ์ด
์์ดํ ์ ์ฒดํฌํฌ์ธํธ ์ผ์ ๋ฌธ์ ๋ฅผ ์ฌ๋ฌ ์์ ํ๋ ฌ ๊ฒฝ๋ก ๋ฌธ์ ๋ก ๋๋๊ธฐ!
์๋ฅผ ๋ค์ด, ์์ ์ ๋ ฅ 1์ ๊ฒฝ์ฐ์๋ ์๋์ ๊ฐ์ด ๊ตฌ์ญ์ ๋๋ ์ ๊ฐ ๊ตฌ์ญ๋ง๋ค ํ๋ ฌ ๊ฒฝ๋ก ๋ฌธ์ ์ ์ฉ
๊ตฌ์ญ์ ๋๋๋ค๊ณ ํํํ๋๋ฐ ์ฌ์ค ์์ดํ ์ ์ผ์ชฝ ์๋ (1, 1) ์ ๊ฐ๊น์ด ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ณ ์ฐจ๋ก๋๋ก ๋จน์ผ๋ก ๊ฐ๋ฉด ๋จ
์ถ๊ฐ๋ก, ์์์ (1, 1)๊ณผ ๋์ฐฉ์ (N, M)์๋ ์์ดํ ์ด ์๋ค๊ณ ์๊ฐํ๋ฉด ๊ตฌํ ๋ ํธํจ
์ฝ๋
๋๋ณด๊ธฐ
import java.io.*;
import java.util.*;
public class Main {
public static class Point {
public int row, col;
public Point(int r, int c) {
row = r;
col = c;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int A = Integer.parseInt(st.nextToken());
int B = Integer.parseInt(st.nextToken());
int[][] dp = new int[N + 1][M + 1];
Point[] points = new Point[A + 2];
boolean[][] obs = new boolean[N + 1][M + 1];
points[0] = new Point(1, 1);
points[A + 1] = new Point(N, M);
for (int i = 1; i <= A; i++) {
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
points[i] = new Point(r, c);
}
for (int i = 0; i < B; i++) {
st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
obs[r][c] = true;
}
br.close();
Arrays.sort(points, (o1, o2) -> {
if (o1.row == o2.row) {
return o1.col - o2.col;
}
return o1.row - o2.row;
});
if (obs[1][1]) {
System.out.println(0);
return;
}
dp[1][1] = 1;
for (int i = 1; i <= A + 1; i++) {
Point start = points[i - 1];
Point end = points[i];
if (dp[start.row][start.col] < 1) {
System.out.println(0);
return;
}
for (int r = start.row + 1; r <= end.row; r++) {
if (obs[r][start.col]) {
break;
}
dp[r][points[i - 1].col] = dp[r - 1][points[i - 1].col];
}
for (int c = start.col + 1; c <= end.col; c++) {
if (obs[start.row][c]) {
break;
}
dp[start.row][c] = dp[start.row][c - 1];
}
for (int r = start.row + 1; r <= end.row; r++) {
for (int c = start.col + 1; c <= end.col; c++) {
if (!obs[r][c]) {
dp[r][c] = dp[r - 1][c] + dp[r][c - 1];
}
}
}
}
System.out.println(dp[N][M]);
}
}
ํ ์คํธ ์ผ์ด์ค
๋๋ณด๊ธฐ
// case 1:
5 8 4 4
1 2
2 5
3 5
4 7
1 5
2 2
2 7
3 6
ans: 4
// case 2:
5 8 4 4
1 2
2 5
3 3
4 7
1 5
2 2
2 7
3 6
ans: 0
// case 3:
5 8 4 0
1 2
2 5
3 3
4 7
ans: 0
// case 4:
1 1 1 0
1 1
ans: 1
'Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ๋ฐฑ์ค 31804 - Chance! (0) | 2024.05.11 |
---|---|
[Java] ๋ฐฑ์ค 31792 - ํ๋น๋ฏธ๋์ด (Hard) (0) | 2024.05.10 |
[Java] ๋ฐฑ์ค 31716 - ํ๋๋ชจ๋น์ค ์์จ ์ฃผํ ํ ์คํ 1 (0) | 2024.04.10 |
[Java] ๋ฐฑ์ค 1707 - ์ด๋ถ ๊ทธ๋ํ (0) | 2024.04.09 |
[Java] ๋ฐฑ์ค 16724 - ํผ๋ฆฌ ๋ถ๋ ์ฌ๋์ด (0) | 2024.03.28 |