https://www.acmicpc.net/problem/1937
๋ฌธ์
- n × n์ ํฌ๊ธฐ์ ๋๋๋ฌด ์ฒ์ด ์๋ค.
- ํ๋ค๋ ์ด๋ค ์ง์ญ์์ ๋๋๋ฌด๋ฅผ ๋จน๊ธฐ ์์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ๊ณณ์ ๋๋๋ฌด๋ฅผ ๋ค ๋จน์ด ์น์ฐ๋ฉด ์, ํ, ์ข, ์ฐ ์ค ํ ๊ณณ์ผ๋ก ์ด๋์ ํ๋ค.
- ๊ทธ ์ฎ๊ธด ์ง์ญ์ ๊ทธ ์ ์ง์ญ๋ณด๋ค ๋๋๋ฌด๊ฐ ๋ง์ด ์์ด์ผ ํ๋ค.
- ์ด๋ค ์ง์ ์ ์ฒ์์ ํ์ด ๋์์ผ ํ๊ณ , ์ด๋ค ๊ณณ์ผ๋ก ์ด๋์ ์์ผ์ผ ํ๋ค๊ฐ ์ต๋ํ ๋ง์ ์นธ์ ๋ฐฉ๋ฌธํ ์ ์๋์ง ๊ณ ๋ฏผ์ ๋น ์ ธ ์๋ค.
- ํ๋ค๊ฐ ์ด๋ํ ์ ์๋ ์นธ์ ์์ ์ต๋๊ฐ์ ์ถ๋ ฅํ๋ค.
์ ํ์ฌํญ
- ๋๋๋ฌด ์ฒ์ ํฌ๊ธฐ n(1 ≤ n ≤ 500)
- ๋๋๋ฌด์ ์์ 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์์ฐ์
ํ์ด
- ๊ทธ๋ํ ํ์ : DFS
๊ทธ๋ํ ๋ด์์ ์ํ์ข์ฐ์ ์ค ํ ๊ณณ์ผ๋ก ์ต๋ํ ์ด๋ํ ์ ์์ ๋๊น์ง ๊ณ์ ์ด๋ํด ์ต๋๊ฐ์ ๊ตฌํด์ผ ํ๋ค. ๊ทธ๋์ DFS๋ก ํ์์ ํ๊ธฐ๋ก ํ๋ค.
๋ชจ๋ ์ง์ ๋ณ๋ก ๋ฐฉ๋ฌธํ ์ ์๋ ์ต๋ ์นธ ์๋ฅผ ๊ตฌํด์ผ ํ๋ค. ๋งค๋ฒ ๋ชจ๋ ์ง์ ์ ๋ํด DFS๋ฅผ ํ๋ค๋ฉด ์ค๋ณต๋๋ ๋ถ๋ถ์ด ๋ฐ์ํด ๋นํจ์จ์ ์ด๋ค. ์ค๋ณต์ ์ธ ํ์์ ์ค์ผ ๋ฐฉ๋ฒ์ด ํ์ํ๋ค.
- DP : ํด๋น ์ง์ ์ ์์์ผ๋ก ๋ฐฉ๋ฌธํ ์ ์๋ ์ต๋๊ฐ ์ ์ฅํ๊ธฐ
๊ทธ๋ํ์ ๊ฐ์ 2์ฐจ์์ DP ๋ฐฐ์ด์ ํด๋น ์ง์ ์ ์์์ผ๋ก ๋ฐฉ๋ฌธํ ์ ์๋ ์ต๋๊ฐ ์ ์ฅํ๋ค. ๊ทธ๋ ๊ฒ ๋๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ ๊ณณ์ ๋ํด์๋ ๋ฐฐ์ด์ ์ ์ฅํด๋ ๊ฐ์ ํ์ฉํ์ฌ ํ์์ ์ค์ผ ์ ์๋ค.
DP ๋ฐฐ์ด์ ์ด๊ธฐ๊ฐ์ 0์ผ๋ก, ๊ฐฑ์ ์ด ๋์๋ค๋ฉด 0์ด ์๋๋ฏ๋ก ๋ฐฉ๋ฌธ ์ฌ๋ถ๋ฅผ ์ ์ ์๋ค. ๋ฐ๋ผ์ ๋ณ๋์ visited ๋ฐฐ์ด์ ํ์๊ฐ ์๋ค.
์ด๋ค ์ง์ (x, y)์ ์ต๋๊ฐ์ ๋ค์ ์ง์ (nx, ny)์ + 1์ด ๋ ๊ฒ์ด๋ค.
dp[x][y] = dfs(nx, ny) + 1
ํ์ง๋ง, ๊ฒฝ๋ก๋ณ ์ต๋๊ฐ์ด ๋ค๋ฅด๋ฏ๋ก ํ์ํ ๋๋ง๋ค ํด๋น ์ง์ ์ ์ต๋๊ฐ์ ๊ฐฑ์ ํด์ค์ผ ํ๋ค.
dp[x][y] = Math.max(dp[x][y], dfs(nx, ny) + 1)
๋ค์๊ณผ ๊ฐ์ด ํ์ฌ 5์ ์์น์์ ์ด๋ํ ์ ์๋ ๊ณณ์ ์๋จ์ธ 12์ ์ผ์ชฝ์ธ 11์ด๋ค. ์๋จ์ ๋จผ์ ํ์ํ๊ฒ ๋ ๊ฒฝ์ฐ 5์ ์์น์ DP ๊ฐ์ 1+1 = 2๊ฐ ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ๋ค์์ ์ผ์ชฝ์ธ 11์ ํ์ํ๊ฒ ๋๋ค๋ฉด 2+1 = 3์ผ๋ก, ๋จผ์ ํ์ํ 2๋ณด๋ค ๊ฐ์ด ๋ ํฌ๋ฏ๋ก DP ๊ฐ์ ๊ฐฑ์ ๋์ด์ผ ํ๋ค.
์ฝ๋
import java.io.*;
import java.util.*;
public class BOJ_์์ฌ์์ดํ๋ค {
static int N;
static int[][] graph;
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());
graph = new int[N][N];
for(int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
for(int j = 0; j < N; j++) {
graph[i][j] = Integer.parseInt(st.nextToken());
}
}
dp = new int[N][N];
int max = 0;
for(int i = 0; i < N; i++) {
for(int j = 0; j < N; j++) {
max = Math.max(max, dfs(i, j));
}
}
System.out.println(max);
}
public static int dfs(int x, int y) {
if(dp[x][y] != 0) { //์ด๋ฏธ ๋ฐฉ๋ฌธํ์ ์์
return dp[x][y];
}
dp[x][y] = 1; //์ด๊ธฐ๊ฐ
for(int d = 0; d < 4; d++) { //์ฌ๋ฐฉํ์
int nx = x + dx[d];
int ny = y + dy[d];
if(nx < 0 || nx >= N || ny < 0 || ny >= N) continue; //๋ฒ์ ๋ฒ์ด๋จ
if(graph[x][y] < graph[nx][ny]) {
dp[x][y] = Math.max(dp[x][y], dfs(nx, ny) + 1); //ํ์ : ์ต๋๊ฐ์ด ๋์ด์ผํจ
}
}
return dp[x][y];
}
}
๊ฒฐ๊ณผ
๋ฐฐ์ด์
'Algorithm > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค 18513๋ฒ : ์ํฐ (0) | 2024.01.27 |
---|---|
๋ฐฑ์ค 15486๋ฒ : ํด์ฌ2 (0) | 2024.01.14 |
๋ฐฑ์ค 20440๋ฒ : ๐ต๋๊ฐ ์ซ์ด ์ซ์ด ๋๋ฌด ์ซ์ด ์ซ์ด ์ค์ง ๋ง ๋ด๊ฒ ์ฐ์ฉ๋์ง๋ง๐ต - 1 (0) | 2024.01.13 |
๋ฐฑ์ค 1749๋ฒ : ์ ์๋ฐ๋จน๊ธฐ (0) | 2024.01.12 |
๋ฐฑ์ค 14846๋ฒ : ์ง์ฌ๊ฐํ๊ณผ ์ฟผ๋ฆฌ (0) | 2024.01.12 |