[Boj_1937] ์์ฌ์์ด ํ๋ค
๐ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/1937
โธ ๋ฌธ์
n × n์ ํฌ๊ธฐ์ ๋๋๋ฌด ์ฒ์ด ์๋ค. ์์ฌ์์ด ํ๋ค๋ ์ด๋ค ์ง์ญ์์ ๋๋๋ฌด๋ฅผ ๋จน๊ธฐ ์์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ณณ์ ๋๋๋ฌด๋ฅผ ๋ค ๋จน์ด ์น์ฐ๋ฉด ์, ํ, ์ข, ์ฐ ์ค ํ ๊ณณ์ผ๋ก ์ด๋์ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๊ทธ๊ณณ์์ ๋๋๋ฌด๋ฅผ ๋จน๋๋ค. ๊ทธ๋ฐ๋ฐ ๋จ ์กฐ๊ฑด์ด ์๋ค. ์ด ํ๋ค๋ ๋งค์ฐ ์์ฌ์ด ๋ง์์ ๋๋๋ฌด๋ฅผ ๋จน๊ณ ์๋ฆฌ๋ฅผ ์ฎ๊ธฐ๋ฉด ๊ทธ ์ฎ๊ธด ์ง์ญ์ ๊ทธ ์ ์ง์ญ๋ณด๋ค ๋๋๋ฌด๊ฐ ๋ง์ด ์์ด์ผ ํ๋ค.
์ด ํ๋ค์ ์ฌ์ก์ฌ๋ ์ด๋ฐ ํ๋ค๋ฅผ ๋๋๋ฌด ์ฒ์ ํ์ด ๋์์ผ ํ๋๋ฐ, ์ด๋ค ์ง์ ์ ์ฒ์์ ํ์ด ๋์์ผ ํ๊ณ , ์ด๋ค ๊ณณ์ผ๋ก ์ด๋์ ์์ผ์ผ ํ๋ค๊ฐ ์ต๋ํ ๋ง์ ์นธ์ ๋ฐฉ๋ฌธํ ์ ์๋์ง ๊ณ ๋ฏผ์ ๋น ์ ธ ์๋ค. ์ฐ๋ฆฌ์ ์๋ฌด๋ ์ด ์ฌ์ก์ฌ๋ฅผ ๋์์ฃผ๋ ๊ฒ์ด๋ค. n × n ํฌ๊ธฐ์ ๋๋๋ฌด ์ฒ์ด ์ฃผ์ด์ ธ ์์ ๋, ์ด ํ๋ค๊ฐ ์ต๋ํ ๋ง์ ์นธ์ ์ด๋ํ๋ ค๋ฉด ์ด๋ค ๊ฒฝ๋ก๋ฅผ ํตํ์ฌ ์์ง์ฌ์ผ ํ๋์ง ๊ตฌํ์ฌ๋ผ.
โธ ์ ๋ ฅ
์ฒซ์งธ ์ค์ ๋๋๋ฌด ์ฒ์ ํฌ๊ธฐ n(1 ≤ n ≤ 500)์ด ์ฃผ์ด์ง๋ค. ๊ทธ๋ฆฌ๊ณ ๋์งธ ์ค๋ถํฐ n+1๋ฒ์งธ ์ค๊น์ง ๋๋๋ฌด ์ฒ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋ค. ๋๋๋ฌด ์ฒ์ ์ ๋ณด๋ ๊ณต๋ฐฑ์ ์ฌ์ด๋ก ๋๊ณ ๊ฐ ์ง์ญ์ ๋๋๋ฌด์ ์์ด ์ ์ ๊ฐ์ผ๋ก ์ฃผ์ด์ง๋ค. ๋๋๋ฌด์ ์์ 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์์ด๋ค.
โธ ์ถ๋ ฅ
์ฒซ์งธ ์ค์๋ ํ๋ค๊ฐ ์ด๋ํ ์ ์๋ ์นธ์ ์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
๐ ๋ฌธ์ ์ ๋ณด
- ๐ฅ ๋ฌธ์ ๋ ๋ฒจ : ๊ณจ๋ 3
- ๐ ๋ฌธ์ ์ ํ : ๋ค์ด๋๋ฏน ํ๋ก๊ทธ๋๋ฐ, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ๊น์ด ์ฐ์ ํ์
- ๐ฌ ํ์ด ์ธ์ด : JAVA
๐ค ๋ฌธ์ ํ์ด
์ด ๋ฌธ์ ๋ DFS ๋ง์ผ๋ก ํด๊ฒฐํ๋ฉด ์๊ฐ ์ด๊ณผ๊ฐ ๋๊ธฐ ๋๋ฌธ์, DP์ ํจ๊ป ์ฌ์ฉํ์ฌ ํด๊ฒฐํ ์ ์๋ค.
DP๋ฅผ ์ด์ฉํด ์ด๋ฏธ ํ์ํ ๊ฒฝ๋ก๋ฅผ ์ ์ฅํ๊ณ , ๊ฐ์ ๊ฒฝ๋ก๋ฅผ ๋ค์ ๋ฐฉ๋ฌธํ ๋ ์ ์ฅ๋ ๊ฐ์ ์ฌ์ฉํ๋ฉด ์ค๋ณต ํ์์ ๋ฐฉ์งํ ์ ์๋ค.
dp[i][j]๋ฅผ ์ขํ (i, j)์์ ์ถ๋ฐํ์ ๋ ํ๋ค๊ฐ ์ด๋ํ ์ ์๋ ์ต๋ ์นธ ์๋ผ๊ณ ๋ณธ๋ค.
์ฆ, dp[i][j] = k๋ผ๋ฉด, ํ๋ค๊ฐ (i, j)์์ ์ถ๋ฐํ์ ๋, ์ต๋ k ์นธ ์ด๋ํ ์ ์๋ค๋ ๋ป์ด๋ค.
์ด๋ฅผ ๊ตฌํ๊ธฐ ์ํด, DFS๋ฅผ ํ์ฉํ์ฌ ๋ค ๋ฐฉํฅ์ผ๋ก ์ด๋ํ๋ฉฐ, ์ด๋ํ ์ ์๋ ์ต๋๊ฐ์ ๊ณ์ฐํ๊ณ dp[i][j]์ ์ ์ฅํ๋ค.
์๋์ ๊ฐ์ ๋๋๋ฌด ์ฒ์ด ์๋ค๊ณ ๊ฐ์ ํ์.
2 | 3 |
1 | 4 |
ํ๋ค๊ฐ (0, 0)์์ ์ถ๋ฐํ๋ค๋ฉด, ํ๋ค๋ 2 → 3 → 4 ์์๋ก ์ด๋ํ ์ ์๋ค. ๋ฐ๋ผ์ ์ต๋ ์ด๋ ๊ฑฐ๋ฆฌ๋ 3์ด๋ฉฐ, dp[0][0] = 3์ด ๋๋ค.
ํ๋ค๊ฐ (1, 0)์์ ์ถ๋ฐํ๋ค๋ฉด, ํ๋ค๋ 1 → 2 → 3 → 4 ์์๋ก ์ด๋ํ ์ ์๋ค.
1 → 2๋ก ์ด๋ํ ํ, dp[0][0] = 3์ด ์ด๋ฏธ ์ ์ฅ๋์ด ์์ผ๋ฏ๋ก dp[1][0] = dp[0][0] + 1 = 4๊ฐ ๋๋ค.
์ ํ์ด๋ฅผ ์ฝ๋๋ก ์์ฑํด ๋ณด๋ฉด ์๋์ ๊ฐ๋ค.
โ ์ต์ข ์ฝ๋
๋ฉ๋ชจ๋ฆฌ : 40580KB
์๊ฐ : 380ms
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int n;
static int[][] map;
static int[][] dp;
static int[] dx = {-1, 1, 0, 0};
static int[] dy = {0, 0, -1, 1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine()); // ๋๋๋ฌด ์ฒ์ ํฌ๊ธฐ
map = new int[n][n];
StringTokenizer st;
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 = new int[n][n];
int ans = 0; // ํ๋ค๊ฐ ์ด๋ํ ์ ์๋ ์นธ์ ์์ ์ต๋๊ฐ
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
ans = Math.max(ans, dfs(i, j));
}
}
System.out.println(ans);
}
private static int dfs(int x, int y) {
if (dp[x][y] != 0) { // ์ด๋ฏธ ๊ฒฝ๋ก๊ฐ ์์
return dp[x][y];
}
// ํ๋ค๋ ์ต์ ํ ๊ตฐ๋ฐ์์ ๋๋๋ฌด๋ฅผ ๋จน์ ์ ์์
dp[x][y] = 1;
for (int i = 0; i < 4; i++) {
int nx = dx[i] + x;
int ny = dy[i] + y;
// ๋ฒ์ ์ฒดํฌ
if (rangeCheck(nx, ny)) continue;
// ๋๋๋ฌด๋ฅผ ๋จน๊ณ ์๋ฆฌ๋ฅผ ์ฎ๊ธฐ๋ฉด
// ๊ทธ ์ฎ๊ธด ์ง์ญ์ ๊ทธ ์ ์ง์ญ๋ณด๋ค ๋๋๋ฌด๊ฐ ๋ง์ด ์์ด์ผ ํจ
if (map[x][y] < map[nx][ny]) {
// ์ํ์ข์ฐ ์ค ๊ฐ์ฅ ๋ง์ด ๋จน์ ์ ์์ ๊ฒฝ๋ก ํ์
dp[x][y] = Math.max(dp[x][y], dfs(nx, ny)+1);
}
}
return dp[x][y];
}
private static boolean rangeCheck(int x, int y) {
return x < 0 || x >= n || y < 0 || y >= n;
}
}
์ฒ์์๋ DFS ๋๋ฆฌ๋ฉด์ ๋ค ๊ฒ์ฌํ๋ฉด ๋๋ค๊ณ ์๊ฐํ๋๋ฐ, ์๊ณ ๋ฆฌ์ฆ ๋ถ๋ฅ๋ฅผ ๋ณด๋ DP๊ฐ ์์ด, ๋ค๋ฅธ ์ฌ๋์ ํ์ด๋ฅผ ๋ณด๊ณ ์์ด๋์ด๋ฅผ ์ป์ด ํด๊ฒฐํ๋ค. DP๋ ํ๊ธฐ๋ ์ซ๊ณ ,, ๋๋ฌด ์ด๋ ต๋ค,,
๊ทธ๋๋ ์ค๋๋ง์ ์ฌ๋ฐ๋ ๋ฌธ์ ๋ฅผ ํผ ๊ฒ ๊ฐ์ ํฌ์คํ ํด ๋ณธ๋ค ! ๐