04
07

โ–ถ ์œ ํ˜•

  • ๊ทธ๋ƒฅ DFS๋ฅผ ๋Œ๋ ธ์„ ๋•Œ ์—„์ฒญ๋‚œ ์—ฐ์‚ฐ๋Ÿ‰(์žฌ๊ท€ํ˜ธ์ถœ)๋กœ ์ธํ•ด ์‹œ๊ฐ„์ดˆ๊ณผ, ์Šคํƒ์ดˆ๊ณผ, ๋ฉ”๋ชจ๋ฆฌ์ดˆ๊ณผ ๋“ฑ์„ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ.
  • ์ด์ „ ๊ฒฝ์šฐ์˜ ์ˆ˜๊ฐ€ ํ˜„์žฌ ๊ฒฝ์šฐ์— ๋ฐ˜์˜๋˜๋Š” DP๋ฅผ ํ™œ์šฉํ•ด์•ผ ํ•˜๋Š” ์œ ํ˜•์ด๋‹ค.

DFS๋Š” ๊นŠ์ด ์šฐ์„  ํƒ์ƒ‰์œผ๋กœ ํ˜„์žฌ ์ž๊ธฐ ์‹œ์ ์—์„œ ๋‹ค์Œ ์ง€์ ์œผ๋กœ ์ ‘๊ทผํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ธ๋ฐ, ์žฌ๊ท€ํ˜ธ์ถœ ์‹œ ์ด๋ฏธ ๋ฐฉ๋ฌธํ•œ ๊ฒฝ์šฐ๋„ ํ•ด๋‹น ์žฌ๊ท€ ๋ถ„๊ธฐ์—์„œ๋Š” ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์ ‘๊ทผํ•˜๊ธฐ ๋•Œ๋ฌธ์— map์ด ํฌ๊ฑฐ๋‚˜, ๊ทธ๋ž˜ํ”„์˜ depth๊ฐ€ ๊นŠ์œผ๋ฉด ์š”๊ตฌํ•˜๋Š” ์‹œ๊ฐ„, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ดˆ๊ณผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

ํ”ผ๋ณด๋‚˜์น˜๊ฐ€ ์ œ์ผ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ์ธ๋ฐ, ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด์ž

graph TD;
    A(fib5) --> B(fib4)
    A --> C(fib3)
    B --> D(fib3)
    B --> E(fib2)
    C --> F(fib2)
    C --> G(fib1)
    D --> H(fib1)
    E --> I(fib1)
    F --> J(fib2)
    F --> K(fib1)
    G --> L(fib1)
    H --> M(fib4)
    H --> N(fib3)
    M --> O(fib2)
    M --> P(fib1)
    N --> Q(fib2)
    N --> R(fib1)
    O --> S(fib1)
    Q --> T(fib1)

leaf๋…ธ๋“œ๋กœ ๊ฐˆ ์ˆ˜๋ก ์ค‘๋ณต๋œ ํ•จ์ˆ˜๋“ค์„ ๊ณ„์† ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด ์ค‘๋ณตํ˜ธ์ถœ์„ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์€ ์žฌ๊ท€ํ˜ธ์ถœ ์ „ ์ด์ „์— ์—ฐ์‚ฐ๋œ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ๊ทธ ๊ฐ’์„ ์ฐธ์กฐํ•ด์„œ ํ˜ธ์ถœ ํšŸ์ˆ˜๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ธ๋ฐ ์ด๊ฑธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. 

DP์˜ ๊ฐ€์žฅ ๋ฌด๋‚œํ•œ ์ ‘๊ทผ๋ฐฉ๋ฒ•์ด ์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ํ™œ์šฉํ•ด์„œ ๋‹ค์Œ ๊ฐ’์„ ๋„์ถœํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ง€๊ธˆ ์ƒํ™ฉ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๋Œ€์ƒ ๋ฌธ์ œ๋กœ ๋ฐฑ์ค€ 1520๋ฒˆ์˜ ๋‚ด๋ฆฌ๋ง‰๊ธธ ๋ฌธ์ œ๋ฅผ ํ’€์–ด๋ณด์ž.

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

 

1520๋ฒˆ: ๋‚ด๋ฆฌ๋ง‰ ๊ธธ

์ฒซ์งธ ์ค„์—๋Š” ์ง€๋„์˜ ์„ธ๋กœ์˜ ํฌ๊ธฐ M๊ณผ ๊ฐ€๋กœ์˜ ํฌ๊ธฐ N์ด ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ์ด์–ด ๋‹ค์Œ M๊ฐœ ์ค„์— ๊ฑธ์ณ ํ•œ ์ค„์— N๊ฐœ์”ฉ ์œ„์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๊ฐ ์ง€์ ์˜ ๋†’์ด๊ฐ€ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค.

www.acmicpc.net

โ–ถ ์ „๋žต

๋จผ์ € DP๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜์„ ๋•Œ์˜ ์ฝ”๋“œ๋‹ค.

import java.io.*;
import java.util.*;

class Main {
	static int[] di = { -1, 0, 1, 0 };
	static int[] dj = { 0, 1, 0, -1 };
	static int n, m;
	static int cnt = 0;
	static int[][] map;
	static boolean[][] v;

	public static void dfs(int ci, int cj) {
		if (ci == n - 1 && cj == m - 1) {
			cnt++;
			return;
		}

		boolean fail = true;
		for (int i = 0; i < 4; i++) {
			int ni = di[i] + ci;
			int nj = dj[i] + cj;
			if (isValid(ci, cj, ni, nj)) {
				fail = false;
				v[ni][nj] = true;
				dfs(ni, nj);
				v[ni][nj] = false;
			}
		}
		if (fail)
			return;

	}

	public static boolean isValid(int ci, int cj, int ni, int nj) {
		return ni < n && nj < m && ni >= 0 && nj >= 0 && !v[ni][nj] && map[ci][cj] > map[ni][nj];
	}

	public static void main(String args[]) throws Exception {
		System.setIn(new FileInputStream("res/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		map = new int[n][m];
		v = new boolean[n][m];
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < m; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
			}
		}
		v[0][0] = true;
		dfs(0, 0);
		System.out.println(cnt);
	}
}

์ „ํ˜•์ ์ธ DFS์ฝ”๋“œ์ธ๋ฐ, ์ด๊ฑธ๋กœ ์ œ์ถœํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋‚œ๋‹ค. ์™œ ๋‚ ๊นŒ?

์ž…๋ ฅ์„ ํ™•์ธํ•ด์•ผ๋œ๋‹ค.

์ฒซ์งธ ์ค„์—๋Š” ์ง€๋„์˜ ์„ธ๋กœ์˜ ํฌ๊ธฐ M๊ณผ ๊ฐ€๋กœ์˜ ํฌ๊ธฐ N์ด ๋นˆ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. ์ด์–ด ๋‹ค์Œ M๊ฐœ ์ค„์— ๊ฑธ์ณ ํ•œ ์ค„์— N๊ฐœ์”ฉ ์œ„์—์„œ๋ถ€ํ„ฐ ์ฐจ๋ก€๋กœ ๊ฐ ์ง€์ ์˜ ๋†’์ด๊ฐ€ ๋นˆ ์นธ์„ ์‚ฌ์ด์— ๋‘๊ณ  ์ฃผ์–ด์ง„๋‹ค. M๊ณผ N์€ ๊ฐ๊ฐ 500์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๊ณ , ๊ฐ ์ง€์ ์˜ ๋†’์ด๋Š” 10000์ดํ•˜์˜ ์ž์—ฐ์ˆ˜์ด๋‹ค.

map์˜ ์ตœ๋Œ€ ํฌ๊ธฐ๊ฐ€ 500x500์ด๊ณ , ๊ฐ ์นธ์—์„œ 4๋ฐฉํ–ฅ์œผ๋กœ ์žฌ๊ท€ํƒ์ƒ‰์„ ํ•œ๋‹ค. 25000๊ฐœ์˜ ์นธ์—์„œ 4๋ฐฉํ–ฅ ์žฌ๊ท€ํƒ์ƒ‰์ธ๋ฐ, ๊ทธ๋Ÿผ ์žฌ๊ท€๋Š” ์ตœ๋Œ€ 4^25000๋ฒˆ ๋Œ ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. 4^20์ด ๋Œ€๋žต 1์กฐ์ด๋‹ˆ๊นŒ ๋ง๋„ ์•ˆ๋˜๊ฒŒ ํฐ ์ˆซ์ž๊ฐ€ ๋‚˜์˜จ๋‹ค. ๋‹น์—ฐํžˆ ์žฌ๊ท€์Šคํƒ์ด ํ„ฐ์ง„๋‹ค๊ณ ๋ด๋„ ๋˜๊ณ , ์Šคํƒ์ด ํ„ฐ์ง€์ง€์•Š๋”๋ผ๋„ ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฐ๋‹ค. 

 

๊ทธ๋Ÿผ ์–ด๋–ป๊ฒŒ ํ’€์–ด์•ผํ• ๊นŒ? 

๊ฐˆ ์ˆ˜ ์žˆ๋Š” ๋‚ด๋ฆฌ๋ง‰๊ธธ ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ฐ ์นธ dp[ci][cj] ์— ๋‹ด์œผ๋ฉด์„œ ์ด๋™ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค. 

class Main {
	static int[] di = { -1, 0, 1, 0 };
	static int[] dj = { 0, 1, 0, -1 };
	static int n, m;
	static int[][] map;
	static int[][] dp;

	public static int dfs(int ci, int cj) {
		if (ci == n - 1 && cj == m - 1) {
			return 1;
		}
		if (dp[ci][cj] != -1)
			return dp[ci][cj]; // ๋ฐฉ๋ฌธํ–ˆ์œผ๋‹ˆ๊นŒ ๊ณ„์‚ฐํ•˜์ง€์•Š๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.
		dp[ci][cj] = 0; // ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
		for (int i = 0; i < 4; i++) {
			int ni = di[i] + ci;
			int nj = dj[i] + cj;
			if (isValid(ci, cj, ni, nj)) {
				dp[ci][cj] += dfs(ni, nj);
			}
		}
		return dp[ci][cj]; // ์žฌ๊ท€ํ˜ธ์ถœ์„ ๋‹ค ํ•˜๊ณ ๋‚˜์„œ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.
	}

	public static boolean isValid(int ci, int cj, int ni, int nj) {
		return ni < n && nj < m && ni >= 0 && nj >= 0 && map[ci][cj] > map[ni][nj];
	}

	public static void main(String args[]) throws Exception {
		System.setIn(new FileInputStream("res/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		n = Integer.parseInt(st.nextToken());
		m = Integer.parseInt(st.nextToken());
		map = new int[n][m];
		dp = new int[n][m];
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < m; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				dp[i][j] = -1;
			}
		}
		dfs(0, 0);
		System.out.println(dp[0][0]); // ์ด๋Ÿฌ๋ฉด ์ตœ์ข…์ ์œผ๋กœ๋Š” dp[0][0]์— ๊ฐ’์ด ๋ˆ„์ ๋˜์–ด์žˆ์„ ๊ฒƒ์ด๋‹ค.
	}
}

๊ทธ๋ƒฅ ์ฝ”๋“œ๋งŒ ๋ณด๋ฉด ์ด๊ฑธ๋กœ ๋ญ ๋‹จ์ถ•์ด ๋˜๊ฒ ๋ƒ ์‹ถ์€๋ฐ, ์ƒํƒœ๊ณต๊ฐ„ํŠธ๋ฆฌ๋กœ ๋น„๊ตํ•˜๋ฉด ํ™• ๋‹ฌ๋ผ์ง„๋‹ค.

graph TD;
    A((0,0))
    A --> B((1,0))
    B --> C((2,0))
    A --> D((0,1))
    D --> E((1,1))
    E --> F((1,2))
    F --> G((1,3))
    G --> H((2,3))
    H --> I((3,3))
    I --> J((3,4))
    J --> K((3,5))
    K --> L((3,6))
    L --> M((3,7))

์ด๊ฒŒ DP๋ฐฐ์—ด์„ ํ™œ์šฉํ• ๋•Œ์˜ ์ƒํƒœ๊ณต๊ฐ„ ํŠธ๋ฆฌ์ด๊ณ 

์•„๋ž˜๊ฐ€ DP๋ฐฐ์—ด ์—†์ด ํ˜ธ์ถœํ•  ๋•Œ์˜ ์ƒํƒœ๊ณต๊ฐ„ ํŠธ๋ฆฌ๋‹ค.

graph TD;
    A((0,0))
    A --> B((1,0))
    B --> C((2,0))
    C --> D((3,0))
    B --> E((1,1))
    E --> F((2,1))
    F --> G((3,1))
    E --> H((1,2))
    H --> I((2,2))
    I --> J((3,2))
    H --> K((1,3))
    K --> L((2,3))
    L --> M((3,3))
    K --> N((0,3))
    N --> O((1,3))
    O --> P((2,3))
    N --> Q((0,4))
    Q --> R((1,4))
    R --> S((2,4))
    Q --> T((0,5))
    T --> U((1,5))
    U --> V((2,5))
    T --> W((0,6))
    W --> X((1,6))
    X --> Y((2,6))
    W --> Z((0,7))

๋˜‘๊ฐ™์ด (3,7) ์„ ์ฐพ์•„๊ฐ€๋Š” ์ฝ”๋“œ์ธ๋ฐ,  ์—„์ฒญ๋‚œ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค, DFS๋งŒ ์‚ฌ์šฉํ•œ ์ฝ”๋“œ๋Š” ์‹ฌ์ง€์–ด ํŠธ๋ฆฌ ์ƒ์— ๋‚˜์˜ค์ง€๋„ ์•Š์•˜๋‹ค. ์ด ์ฐจ์ด๋ฅผ ํ™œ์šฉํ•˜๋ฉด ๋” ๊นŠ์ด ๋“ค์–ด๊ฐ€๋Š” ๊ฑธ ์ค‘๊ฐ„์— ์—ฐ์‚ฐ๊ฐ’์„ ๋ถˆ๋Ÿฌ์™€ ๋Š์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ๊ฒŒ๋˜๋ฏ€๋กœ ์—„์ฒญ๋‚œ ์žฌ๊ท€ํ˜ธ์ถœ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๊ฒŒ๋œ๋‹ค. ๋น„์Šทํ•œ ๋ฌธ์ œ๋กœ ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค.

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

 

1937๋ฒˆ: ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค

n × n์˜ ํฌ๊ธฐ์˜ ๋Œ€๋‚˜๋ฌด ์ˆฒ์ด ์žˆ๋‹ค. ์š•์‹ฌ์Ÿ์ด ํŒ๋‹ค๋Š” ์–ด๋–ค ์ง€์—ญ์—์„œ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋จน๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๊ณณ์˜ ๋Œ€๋‚˜๋ฌด๋ฅผ ๋‹ค ๋จน์–ด ์น˜์šฐ๋ฉด ์ƒ, ํ•˜, ์ขŒ, ์šฐ ์ค‘ ํ•œ ๊ณณ์œผ๋กœ ์ด๋™์„ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋˜ ๊ทธ๊ณณ์—

www.acmicpc.net

๋‚ด๋ฆฌ๋ง‰๊ธธ๊ณผ ๊ฑฐ์˜ ๋น„์Šทํ•œ ์œ ํ˜•์ธ๋ฐ ์ข€ ๋” ๋ณต์žกํ•˜๋‹ค. base case๊ฐ€ ๋”์ด์ƒ ๋ป—์–ด๋‚˜๊ฐ€๋ฉด ์•ˆ๋˜๋Š” ๊ฒŒ ์กฐ๊ฑด์ด๊ณ , ๊ฒฐ๊ณผ๊ฐ’์œผ๋กœ๋Š” ๊ฐ€์žฅ depth๊ฐ€ ๊นŠ์€ ๊ฒฝ์šฐ์˜ depth๋ฅผ ์ถœ๋ ฅํ•ด์•ผํ•œ๋‹ค. 

๊ทธ๋Ÿผ ์ด๋ฒˆ์—๋Š” ์ตœ๋Œ€ ๊ธธ์ด๊ฐ€ ์ถœ๋ฐœ์ง€์ธ dp[ci][cj]์— ์ €์žฅ๋˜๋„๋ก ์„ค๊ณ„ํ•˜๋ฉด ๋œ๋‹ค. ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ํ•œ์นธ์”ฉ ๋Š˜๋ ค์„œ ๋“ค์–ด๊ฐ€๋ฉด ๋œ๋‹ค.

import java.io.*;
import java.util.*;

class Main {
	static int[] di = { -1, 0, 1, 0 };
	static int[] dj = { 0, 1, 0, -1 };
	static int n;
	static int[][] map;
	static int[][] dp;
	static int max = -1;

	public static int dfs(int ci, int cj) {
		if (dp[ci][cj] != -1)
			return dp[ci][cj]; // ๋ฐฉ๋ฌธํ–ˆ์œผ๋‹ˆ๊นŒ ๊ณ„์‚ฐํ•˜์ง€์•Š๊ณ  ๋ฐ˜ํ™˜ํ•œ๋‹ค.
		dp[ci][cj] = 1; // ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ
		for (int i = 0; i < 4; i++) {
	        int ni = di[i] + ci;
	        int nj = dj[i] + cj;
	        if (isValid(ci, cj, ni, nj)) {
	            dp[ci][cj] = Math.max(dp[ci][cj], 1 + dfs(ni, nj)); // ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•˜๊ณ  ์ตœ๋Œ“๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.
	        }
	    }
	    return dp[ci][cj];
	}

	public static boolean isValid(int ci, int cj, int ni, int nj) {
		return ni < n && nj < n && ni >= 0 && nj >= 0 && map[ci][cj] < map[ni][nj];
	}

	public static void main(String args[]) throws Exception {
		System.setIn(new FileInputStream("res/input.txt"));
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		n = Integer.parseInt(st.nextToken());
		map = new int[n][n];
		dp = new int[n][n];
		for (int i = 0; i < n; i++) {
			st = new StringTokenizer(br.readLine(), " ");
			for (int j = 0; j < n; j++) {
				map[i][j] = Integer.parseInt(st.nextToken());
				dp[i][j] = -1;
			}
		}
		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n; j++) {
				dfs(i, j);
				max = Math.max(max, dp[i][j]);
			}
		}
		System.out.println(max);
	}
}

๊ฑฐ์˜ ๋น„์Šทํ•œ ๋ฌธ์ œ์˜€์ง€๋งŒ base case ์„ค์ •ํ•˜๋Š” ๊ฒŒ ์•ฝ๊ฐ„ ๋‹ฌ๋ผ์„œ ํ’€์–ด๋ณผ ๋งŒํ•œ ๋ฌธ์ œ์˜€๋‹ค.

๋„์›€์ด ๋๋‹ค๋ฉด ๋Œ“๊ธ€์ด๋‚˜ ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์„ธ์š”! ๋กœ๊ทธ์ธ ์•ˆํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค ^_^
๋ฐ˜์‘ํ˜•
COMMENT