๋ฌธ์
ํ์ด
๋จผ์ ๋ชจ๋ ๊ฒฝ๋ก์ ์๋ฅผ ๊ตฌํด์ผํ๊ธฐ ๋๋ฌธ์ DFS๋ฅผ ์ฌ์ฉํด ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๋ค. ํ์ง๋ง ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ํ์ํ๊ฒ ๋๋ ๊ฒฝ์ฐ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ค์ด๊ธฐ ์ํ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
์๊ฐํ ์์ด๋์ด๋ ํ ๋ฒ ๋ฐฉ๋ฌธํ๋ ์ขํ๋ฅผ x,y๋ผ๊ณ ํ์ ๋, (x,y) ์์ (N-1, N-1)๊น์ง์ ๊ฒฝ๋ก๋ ์ด๋ฏธ ๊ตฌํด์ ธ์๊ณ ๋ณํ์ง ์๊ธฐ ๋๋ฌธ์ ๋ค์ ํ์ํ ํ์๊ฐ ์๋ค๋ ์ ์ด๋ค. ๋ฐ๋ผ์ dfs๋ฅผ ์งํํ๋ฉฐ ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ ํ๊ณ , ๋ฐฉ๋ฌธ์ฒดํฌ๊ฐ ๋ ๊ณณ์ธ ๊ฒฝ์ฐ ์ ์ฅ๋์ด ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํจ์ผ๋ก์จ ์๊ฐ์ ์ค์ผ ์ ์๋ค.
ํ์ง๋ง ์ฃผ์ํ ์ ์ด ์๋ค. ์ด๊ธฐ ์์ฑํ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int M, N, total = 0;
static int[][] map;
static int[][] cache;
static int[] dx = {1, -1, 0, 0}, dy = {0, 0, 1, -1};
public static void main(String[] args) throws IOException {
String[] input = br.readLine().split(" ");
M = Integer.parseInt(input[0]);
N = Integer.parseInt(input[1]);
map = new int[M][N];
cache = new int[M][N];
for (int i = 0; i < M; i++) {
String[] line = br.readLine().split(" ");
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(line[j]);
}
}
System.out.println(dfs(0, 0));
}
private static int dfs(int x, int y) {
if (x == M - 1 && y == N - 1) {
return 1;
}
if (cache[x][y] > 0)
return cache[x][y];
for (int i = 0; i < 4; i++) {
int nX = x + dx[i];
int nY = y + dy[i];
if (nX < 0 || nY < 0 || nX >= M || nY >= N || map[x][y] <= map[nX][nY]) continue;
cache[x][y] += dfs(nX, nY);
}
return cache[x][y];
}
}
์ด๋ ๊ฒ ์์ฑํ ๊ฒฝ์ฐ ์๊ฐ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ค. ์ด์ ๋ cache[x][y]๊ฐ 0๋ณด๋ค ํฐ ๊ฒฝ์ฐ ์บ์ฑ๋ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์์ง๋ง, 0์ธ ๊ฒฝ์ฐ, ํค๋น ์ขํ๋ฅผ ์ด๋ฏธ ๋ฐฉ๋ฌธํ์ง๋ง ์ ๋งํ์ง ์์์ง ์๋๋ฉด ์์ง ๋ฐฉ๋ฌธ์ ํ์ง ์์ ์ง์ ์ธ์ง ๊ตฌ๋ถํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ๊ธฐ์ ์ค๋ณต ํ์์ด ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ด๋ค. ์ด ๋ถ๋ถ์ ๋ฐฉ๋ฌธ์ฒดํฌ๋ก ๋ณ๊ฒฝํ์ฌ ์๊ฐ์ด๊ณผ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์ต์ข ํ์ด๋ ๋ค์๊ณผ ๊ฐ๋ค.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static int M, N, total = 0;
static int[][] map;
static int[][] cache;
static boolean[][] visited;
static int[] dx = {1, -1, 0, 0}, dy = {0, 0, 1, -1};
public static void main(String[] args) throws IOException {
String[] input = br.readLine().split(" ");
M = Integer.parseInt(input[0]);
N = Integer.parseInt(input[1]);
map = new int[M][N];
cache = new int[M][N];
visited = new boolean[M][N];
for (int i = 0; i < M; i++) {
String[] line = br.readLine().split(" ");
for (int j = 0; j < N; j++) {
map[i][j] = Integer.parseInt(line[j]);
}
}
System.out.println(dfs(0, 0));
}
private static int dfs(int x, int y) {
if (x == M - 1 && y == N - 1) {
return 1;
}
if (visited[x][y])
return cache[x][y];
visited[x][y] = true;
for (int i = 0; i < 4; i++) {
int nX = x + dx[i];
int nY = y + dy[i];
if (nX < 0 || nY < 0 || nX >= M || nY >= N || map[x][y] <= map[nX][nY]) continue;
cache[x][y] += dfs(nX, nY);
}
return cache[x][y];
}
}
'๐ Algorithm > ๐ป ๋ฌธ์ ํ์ด' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2629. ์ํ ์ ์ธ (0) | 2021.04.01 |
---|---|
[๋ฐฑ์ค] - 2206. ๋ฒฝ๋ถ์๊ณ ์ด๋ํ๊ธฐ (0) | 2021.03.24 |
[๋ฐฑ์ค] - 1277. ๋ฐ์ ์ ์ค์น (0) | 2021.03.24 |
[๋ฐฑ์ค] 1799. ๋น์ (0) | 2021.03.07 |
[๋ฐฑ์ค] 1967. ํธ๋ฆฌ์ ์ง๋ฆ (0) | 2021.03.06 |
๋๊ธ