2 ๋ถ„ ์†Œ์š”

๐Ÿ“ [S2_10164] ๊ฒฉ์ž์ƒ์˜ ๊ฒฝ๋กœ

package BOJ;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.StringTokenizer;

public class BOJ_S2_10164 {
    static int N, M, O;
    static int ox, oy;
    // ์ด๋™
    static int[] dx = {1, 0};
    static int[] dy = {0, 1};

    static int[][] map;
    static int cnt;

    static ArrayList<Integer> list;

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine(), " ");

        // input
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        O = Integer.parseInt(st.nextToken());

        // map
        map = new int[N][M];

        // map์— ์ˆ˜ ๋„ฃ์–ด์ฃผ๊ธฐ
        int num = 1;
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                map[i][j] = num;
                // ๋™๊ทธ๋ผ๋ฏธ ์ขŒํ‘œ ์ €์žฅ
                if (O != 1 && num == O) {
                    ox = j;
                    oy = i;
                }
                num++;
            }
        }

        list = new ArrayList<>();
        
        // ์ „์ฒด ํšŸ์ˆ˜ ์นด์šดํŒ…
        cnt = 0;

        // ๋งŒ์•ฝ O๊ฐ€ 0์ด๋ฉด ๋ชจ๋“  ๊ฒฝ์šฐ์˜์ˆ˜ ๊ตฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค
        if (O == 0) {
          // ํ•ญ์ƒ ํฌํ•จํ•˜๋Š” ์ˆ˜ ( ๋„์ฐฉ์ง€ )
            O = M * N;
        }
        // dfs ์‹คํ–‰
        dfs(0, 0);

        System.out.println(cnt);
    }

    public static void dfs(int x, int y) {
        // ๊ธฐ์ €์กฐ๊ฑด ( ๋งˆ์ง€๋ง‰ ๊ฐ’์— ๋„์ฐฉ )
        if (x == M - 1 && y == N - 1) {
            // ๋งŒ์•ฝ ๋ฆฌ์ŠคํŠธ์— O๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์นด์šดํŒ…
            if (list.contains(O)) {
                cnt++;
            }
            return;
        }

        // ์ด๋™
        for (int i = 0; i < 2; i++) {
            int nx, ny;
            nx = dx[i] + x;
            ny = dy[i] + y;

            // ๋จผ์ € ๋ฒ”์œ„๋ฅผ ๋„˜์œผ๋ฉด ํ†ต๊ณผ
            if (ny < 0 || ny >= N || nx < 0 || nx >= M) continue;

            // ๋งŒ์•ฝ ๋™๊ทธ๋ผ๋ฏธ ์ขŒํ‘œ๋ณด๋‹ค ์•ž์ด๊ฑฐ๋‚˜ ๋ฐ‘์— ์žˆ์œผ๋ฉด ํ†ต๊ณผ -> ๊ฐˆ ํ•„์š”๊ฐ€ ์—†๋‹ค
            if ((nx < ox && ny > oy) || (nx > ox && ny < oy)) continue;

            // ๋ฆฌ์ŠคํŠธ์— ๊ฐ’ ๋„ฃ๊ธฐ
            list.add(map[ny][nx]);

            // dfs ์‹คํ–‰
            dfs(nx, ny);

            // ๋ฐฑํŠธ๋ž˜ํ‚น ( ๋งจ ๋’ค์— ๊ฒƒ ๋นผ์ฃผ๊ธฐ )
            list.remove(list.size() - 1);
        }
    }
}

๐Ÿค” ๋‚˜์˜ ์ƒ๊ฐ

์„œ๋ธŒํƒœ์Šคํฌ๊ฐ€ ์žˆ๋Š” ๋ฌธ์ œ๋ผ ์ƒ๊ฐ์ด ์ข€ ํ•„์š”ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค.
๊ณ„ํš์€ DFS๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์™„์ „ ํƒ์ƒ‰์„ ํ•ด์ฃผ๊ณ  ์™„์ „ํƒ์ƒ‰์„ ํ•˜๋ฉด์„œ ์ขŒํ‘œ๊ฐ’๋“ค์„ List์— ๋‹ด์•„์„œ ๋งˆ์ง€๋ง‰ ์ขŒํ‘œ์— ๋„์ฐฉํ–ˆ์„ ๋•Œ List์— ๋™๊ทธ๋ผ๋ฏธ ์ขŒํ‘œ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์„œ ์žˆ์œผ๋ฉด ์นด์šดํŒ…์„ ํ•ด์ค€๋‹ค.
์ด ๋ฌธ์ œ์˜ ํฌ์ธํŠธ๋Š” ๋™๊ทธ๋ผ๋ฏธ ์ขŒํ‘œ๋ณด๋‹ค ์•ž์ด๊ฑฐ๋‚˜ ๋ฐ‘์— ์žˆ์œผ๋ฉด ํ†ต๊ณผ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค. ( ์‹œ๊ฐ„ ๋•Œ๋ฌธ์— ) -> 97๋ฒˆ ์ค„
๋‚˜๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ ์ด๊ฒŒ ๋ฌธ์ œ์ผ ๊ฒƒ ๊ฐ™์•„ ๊ณ ๋ คํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์–ด์ฃผ์—ˆ๋‹ค.

  1. ๋จผ์ € ๊ฐ’์„ ์ž…๋ ฅ๋ฐ›์•„ map์„ ์™„์„ฑ์‹œํ‚ค๊ณ  ์•ˆ์— ์ˆซ์ž๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋„ฃ์–ด์ค€๋‹ค.
  2. ๊ทธ๋ฆฌ๊ณ  ๋™๊ทธ๋ผ๋ฏธ๊ฐ€ ์žˆ๋Š” ์ขŒํ‘œ๋ฅผ ๋”ฐ๋กœ ์ €์žฅํ•œ๋‹ค.
  3. ์ฒ˜์Œ (0,0) ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ (N-1,M-1)์— ๋„์ฐฉํ•  ๋•Œ ๊นŒ์ง€ dfs๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.
  4. ๋‹ค์Œ ์ขŒํ‘œ๋กœ ๊ฐ€๊ธฐ ์ „์— ๋ฒ”์œ„๋ฅผ ๋ฒ—์–ด๋‚˜๊ฑฐ๋‚˜ , ๋™๊ทธ๋ผ๋ฏธ๋ณด๋‹ค (y๊ฐ’์ด ์ž‘๊ณ  x๊ฐ’์€ ํฐ ๊ฒฝ์šฐ), (y๊ฐ’์ด ํฌ๊ณ  x๊ฐ’์€ ์ž‘์€ ๊ฒฝ์šฐ) ์ธ ๊ฒฝ์šฐ์—๋Š” ๊ฐˆ ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— continue๋ฅผ ํ†ตํ•ด ํ†ต๊ณผํ•œ๋‹ค.
  5. ์กฐ๊ฑด์„ ํ†ต๊ณผํ•œ ์ขŒํ‘œ๊ฐ’์€ list์— ๋‹ด์•„์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค์‹œ dfs ํ˜ธ์ถœ ( ์ขŒํ‘œ ์ด๋™ )
  6. ๋งˆ์ง€๋ง‰ ๋ชฉํ‘œ ์ขŒํ‘œ์— ๋„์ฐฉํ•˜๋ฉด list๋ฅผ ํ™•์ธํ•ด์„œ ๋™๊ทธ๋ผ๋ฏธ ๊ฐ’์ด ์žˆ์œผ๋ฉด ์นด์šดํŒ…์„ ํ•ด์ค€๋‹ค.
  7. ๋ชจ๋“  ์ขŒํ‘œ๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
  8. ์ด ์นด์šดํŒ…ํ•œ ๊ฐ’์„ ์ถœ๋ ฅํ•ด์ค€๋‹ค.

ํƒœ๊ทธ: , , ,

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: