๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Problem Solving

[Java] ๋ฐฑ์ค€ 2411 - ์•„์ดํ…œ ๋จน๊ธฐ

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