[Boj_1577] ๋„๋กœ์˜ ๊ฐœ์ˆ˜

๐Ÿ“Ž ๋ฌธ์ œ ๋งํฌ

https://www.acmicpc.net/problem/1577

 

โ–ธ ๋ฌธ์ œ

์„ธ์ค€์ด๊ฐ€ ์‚ด๊ณ  ์žˆ๋Š” ๋„์‹œ๋Š” ์‹ ๊ธฐํ•˜๊ฒŒ ์ƒ๊ฒผ๋‹ค. ์ด ๋„์‹œ๋Š” ๊ฒฉ์žํ˜•ํƒœ๋กœ ์ƒ๊ฒผ๊ณ , ์ง์‚ฌ๊ฐํ˜•์ด๋‹ค. ๋„์‹œ์˜ ๊ฐ€๋กœ ํฌ๊ธฐ๋Š” N์ด๊ณ , ์„ธ๋กœ ํฌ๊ธฐ๋Š” M์ด๋‹ค. ๋˜, ์„ธ์ค€์ด์˜ ์ง‘์€ (0, 0)์— ์žˆ๊ณ , ์„ธ์ค€์ด์˜ ํ•™๊ต๋Š” (N, M)์— ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ƒ๊ฒผ๋‹ค.

์„ธ์ค€์ด๋Š” ์ง‘์—์„œ ํ•™๊ต๋กœ ๊ฐ€๋Š” ๊ธธ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ์ด ๋ช‡ ๊ฐœ๊ฐ€ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ด์ง€๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค.

์„ธ์ค€์ด๋Š” ํ•ญ์ƒ ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋กœ๋งŒ ๊ฐ€๊ธฐ ๋•Œ๋ฌธ์—, ํ•ญ์ƒ ๋„๋กœ๋ฅผ ์ •ํ™•ํ•˜๊ฒŒ N + M๊ฐœ ๊ฑฐ์นœ๋‹ค. ํ•˜์ง€๋งŒ, ์ตœ๊ทผ ๋“ค์–ด ์ด ๋„์‹œ์˜ ๋„๋กœ๊ฐ€ ๋ถ€์‹ค๊ณต์‚ฌ ์˜ํ˜น์œผ๋กœ ๊ณต์‚ฌ์ค‘์ธ ๊ณณ์ด ์žˆ๋‹ค. ๋„๋กœ๊ฐ€ ๊ณต์‚ฌ ์ค‘์ผ ๋•Œ๋Š”, ์ด ๋„๋กœ๋ฅผ ์ง€๋‚  ์ˆ˜ ์—†๋‹ค.

(0, 0)์—์„œ (N, M)๊นŒ์ง€ ๊ฐ€๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

 

โ–ธ ์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ๋„๋กœ์˜ ๊ฐ€๋กœ ํฌ๊ธฐ N๊ณผ ์„ธ๋กœ ํฌ๊ธฐ M์ด ์ฃผ์–ด์ง„๋‹ค. N๊ณผ M์€ 100๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๊ณ , ๋‘˜์งธ ์ค„์—๋Š” ๊ณต์‚ฌ์ค‘์ธ ๋„๋กœ์˜ ๊ฐœ์ˆ˜ K๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. K๋Š” 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 50๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ์…‹์งธ ์ค„๋ถ€ํ„ฐ K๊ฐœ ์ค„์—๋Š” ๊ณต์‚ฌ์ค‘์ธ ๋„๋กœ์˜ ์ •๋ณด๊ฐ€ a b c d์™€ ๊ฐ™์ด ์ฃผ์–ด์ง„๋‹ค. a์™€ c๋Š” 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , N๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๊ณ , b์™€ d๋Š” 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , M๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ , (a, b)์™€ (c, d)์˜ ๊ฑฐ๋ฆฌ๋Š” ํ•ญ์ƒ 1์ด๋‹ค.

 

โ–ธ ์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— (0, 0)์—์„œ (N, M)๊นŒ์ง€ ๊ฐ€๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค. ์ด ๊ฐ’์€ 0๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™๊ณ , 263-1๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ์ž์—ฐ์ˆ˜์ด๋‹ค.

 

๐Ÿ“ ๋ฌธ์ œ ์ •๋ณด

  • ๐Ÿฅ‡  ๋ฌธ์ œ ๋ ˆ๋ฒจ : ๊ณจ๋“œ 5
  • ๐Ÿ””  ๋ฌธ์ œ ์œ ํ˜• : ๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ
  • ๐Ÿ’ฌ  ํ’€์ด ์–ธ์–ด : JAVA

 

๐Ÿค” ๋ฌธ์ œ ํ’€์ด

๋‹ค์ด๋‚˜๋ฏน ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ด์šฉํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์ด๋‹ค.

 

์„ธ์ค€์ด๋Š” ํ•ญ์ƒ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋กœ๋งŒ ์ด๋™ํ•˜๋ฏ€๋กœ, ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉํ–ฅ์€ ์˜ค๋ฅธ์ชฝ ๋˜๋Š” ์•„๋ž˜์ชฝ ๋‘ ๊ฐ€์ง€๋ฟ์ด๋‹ค.

๋”ฐ๋ผ์„œ, (0, 0)์—์„œ (N, M)๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” ๊ฒฝ๋กœ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ dp ๋ฐฐ์—ด์„ ์ด์šฉํ•ด ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

1๏ธโƒฃ ์ด๋™ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ์ €์žฅํ•˜๋Š” map ๋ฐฐ์—ด

๊ฐ ์œ„์น˜ (i, j)์—์„œ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉํ–ฅ์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด 3์ฐจ์› ๋ฐฐ์—ด์„ ์„ ์–ธํ•œ๋‹ค.

  • map[i][j][0] → ์•„๋ž˜์ชฝ ์ด๋™ ๊ฐ€๋Šฅ ์—ฌ๋ถ€
  • map[i][j][1] → ์˜ค๋ฅธ์ชฝ ์ด๋™ ๊ฐ€๋Šฅ ์—ฌ๋ถ€
  • ๊ฐ’์ด -1์ด๋ฉด ํ•ด๋‹น ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ ๋ถˆ๊ฐ€๋Šฅ

๊ณต์‚ฌ ์ค‘์ธ ๋„๋กœ๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ, ์ด๋™์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค.

์ด๋•Œ, ๊ณต์‚ฌ ์ค‘์ธ ๋„๋กœ์˜ ์ •๋ณด (x1, y1) → (x2, y2)์˜ ์ž…๋ ฅ ์ˆœ์„œ๊ฐ€ ๋’ค๋ฐ”๋€Œ์—ˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ, ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ๋‘ ์ขŒํ‘œ๋ฅผ ์ •๋ ฌํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

 

2๏ธโƒฃ DP ๋ฐฐ์—ด ์ •์˜ ๋ฐ ์ ํ™”์‹

dp[i][j] → (0,0)์—์„œ (i, j)๊นŒ์ง€ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜์ด๋‹ค.

๋จผ์ €, dp[0][0] = 1๋กœ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค. (์ถœ๋ฐœ์ )

 

  • ์˜ค๋ฅธ์ชฝ ์ด๋™ ๊ฐ€๋Šฅ (map[i][j][1] != -1) → dp[i][j] += dp[i][j-1] (j-1 ≥ 0)
  • ์•„๋ž˜์ชฝ ์ด๋™ ๊ฐ€๋Šฅ (map[i][j][0] != -1) → dp[i][j] += dp[i-1][j] (i-1 ≥ 0)

 dp์˜ ๊ฐ’์ด int์˜ ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๋ฏ€๋กœ ํƒ€์ž…์„ long์œผ๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.

 

 

3๏ธโƒฃ ์ตœ์ข… ๊ฒฐ๊ณผ

dp[n][m] ๊ฐ’์ด (0, 0) → (N, M)๊นŒ์ง€์˜ ๋ชจ๋“  ์ตœ๋‹จ ๊ฒฝ๋กœ ์ˆ˜๊ฐ€ ๋œ๋‹ค.

 

์œ„ ํ’€์ด๋ฅผ ์ฝ”๋“œ๋กœ ์ž‘์„ฑํ•ด ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

 

โœ” ์ตœ์ข… ์ฝ”๋“œ

๋ฉ”๋ชจ๋ฆฌ : 11980KB
์‹œ๊ฐ„ : 68ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    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()); // ์„ธ๋กœ

        // map[i][j][k] : (i, j)์—์„œ k ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐˆ ์ˆ˜ ์žˆ๋Š”์ง€
        // ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ / ์œ„์—์„œ ์•„๋ž˜๋กœ -> ์ด ๋‘ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์ด๋™ ๊ฐ€๋Šฅํ•˜๋‹ค.
        int[][][] map = new int[101][101][2];
        long[][] dp = new long[101][101]; // *

        int k = Integer.parseInt(br.readLine()); // ๊ณต์‚ฌ์ค‘์ธ ๋„๋กœ์˜ ๊ฐœ์ˆ˜

        // ๊ณต์‚ฌ์ค‘์ธ ๋„๋กœ ์ •๋ณด
        int x1, y1, x2, y2;
        for (int i = 0; i < k; i++) {
            st = new StringTokenizer(br.readLine());
            x1 = Integer.parseInt(st.nextToken());
            y1 = Integer.parseInt(st.nextToken());
            x2 = Integer.parseInt(st.nextToken());
            y2 = Integer.parseInt(st.nextToken());

            // -1์ด๋ผ๋ฉด ์ด๋™ ๋ถˆ๊ฐ€๋Šฅ
            if (y1 == y2) {
                // ์ž…๋ ฅ์˜ ์ˆœ์„œ๊ฐ€ ๋ฐ”๋€” ์ˆ˜๋„ ์žˆ์œผ๋ฏ€๋กœ
                // ๊ฐ’์„ ๋ฐ”๊ฟ”์ฃผ๋Š” ๊ณผ์ • ํ•„์š”
                if (x1 > x2) {
                    int tmp = x1;
                    x1 = x2;
                    x2 = tmp;
                }
                map[x2][y1][0] = -1; // ์•„๋ž˜๋กœ ์ด๋™ ๋ถˆ๊ฐ€๋Šฅ / ์™ผ์ชฝ์—์„œ ์˜ค๋ฅธ์ชฝ ์ด๋™
            }

            if (x1 == x2) {
                if (y1 > y2) {
                    int tmp = y1;
                    y1 = y2;
                    y2 = tmp;
                }
                map[x1][y2][1] = -1; // ์™ผ์ชฝ ์ด๋™ ๋ถˆ๊ฐ€๋Šฅ / ์œ„์—์„œ ์•„๋ž˜๋กœ ์ด๋™
            }
        }

        dp[0][0] = 1;
        for (int i = 0; i <= n; i++) {
            for (int j = 0; j <= m; j++) {
                if (map[i][j][0] != -1 && i-1 >= 0) { // x ๋ฐฉํ–ฅ ์ด๋™ ๊ฐ€๋Šฅ
                    dp[i][j] += dp[i-1][j];
                }
                if (map[i][j][1] != -1 && j-1 >= 0) { // y ๋ฐฉํ–ฅ ์ด๋™ ๊ฐ€๋Šฅ
                    dp[i][j] += dp[i][j-1];
                }
            }
        }

        System.out.println(dp[n][m]);
        br.close();
    }
}

 

๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ์กฐ๊ธˆ ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๊ธด ํ–ˆ์ง€๋งŒ, dp๋ฅผ ํ’€๋ฉด์„œ ์žฌ๋ฐŒ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋˜ ๋ฌธ์ œ์ด๋‹ค.

๋‹ค๋ฅธ dp ๋ฌธ์ œ๋„ ํ’€์–ด๋ด์•ผ์ง€ ! ๐Ÿ”ฅ

 

'Algorithm > BOJ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Boj_15980] ๋ช…์ƒ ๋ฐฉํ•ด๊พผ  (0) 2025.04.16
[Boj_7579] ์•ฑ  (0) 2025.03.25
[Boj_19542] ์ „๋‹จ์ง€ ๋Œ๋ฆฌ๊ธฐ  (0) 2025.03.17
[Boj_1937] ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค  (0) 2025.03.04
[Boj_22963] 3์ดˆ ์ •๋ ฌ  (0) 2025.02.26