์ข์ธก ์๋จ์ธ ์ขํ (0, 0)์์ ์์ํ์ฌ ๋ชจ๋ ๋ณด๋๋ฅผ ํ์ํ๋ฉฐ ์ต๋ ๋ช ์นธ ์ง๋ ์ ์๋์ง ํ์ธํ๋ ๋ฌธ์ ์ด๋ค. ์ ์ฒด ๋ณด๋์ ํฌ๊ธฐ๊ฐ ์ต๋ 400์ด๊ธฐ ๋๋ฌธ์ ์์ ํ์์ผ๋ก ์งํํ์ฌ๋ ์๊ฐ ์ด๊ณผ๋ ๋ฐ์ํ์ง ์์ ์ ์๋ค.
ํน์ ์์ ์์ ๊ฐ๋ฅํ ๋ชจ๋ ๋ฐฉํฅ์ ๋ํด ํ์ธํด์ผ ํ๋ค. ์ฌ๊ธฐ์ ๊ฐ๋ฅํ ๊ฒฝ์ฐ๋ ํ์ฌ๊น์ง ์ง๋์จ ๊ฒฝ๋ก ์ค์ ์์ผ๋ก ๋ฐฉ๋ฌธํ ์ํ๋ฒณ์ด ์๋ ๊ฒฝ์ฐ์ด๋ค. ์ฆ ๊ฐ์ ์ํ๋ฒณ์ ๋ ๋ฒ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค. ์ด๋ฐ ํ์์ ๊ฒฝ์ฐ๋ ํญ์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํตํด์ ๊ณ์ ๊ฐ์ ์๋ฆฌ๋ฅผ ๋ฐฉ๋ฌธํ์ง ์์ ์ ์๋๋ก ํ๋ ๊ฒ์ด ์ค์ํ๋ฐ ์ด ๋ฌธ์ ์์๋ ์ด๋ฏธ ๊ฐ์ ์ํ๋ฒณ์ ๋ค์ ๋ฐฉ๋ฌธํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค๋ ์กฐ๊ฑด์ ๊ฑธ์ด์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๊น์ง ํ๊บผ๋ฒ์ ์ฒ๋ฆฌํ ์ ์๋๋ก ์ ์ํด์ฃผ๊ณ ์๋ค.
๊ทธ๋์ ๊น์ด ์ฐ์ ํ์์ ํตํด ๊ฐ๋ฅํ ๋ชจ๋ ๊ฒฝ๋ก์ ๋ํด ํ์ํ๋ฉด์ ๋งค๋ฒ ํ์์ ์ต๋ ๊ธธ์ด๋ฅผ ์ ๋ฐ์ดํธํ๋ค. ์ดํ ํ์ฌ ์์น์์ ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ ๋ชจ๋ ์์น์ ๋ํด์ ํ์ฌ๊น์ง ๋ฐฉ๋ฌธํ ์ ์๋ ์ํ๋ฒณ์ ๊ฒฝ์ฐ์๋ง ๋ฐฉ๋ฌธํ๋ ๊ฒ์ผ๋ก ํ๋ค. ์ด๋ ๊ฒ ์ฒ๋ฆฌํ๊ฒ ๋๋ฉด ์ด๋ฏธ ๋ฐฉ๋ฌธํ ์์น์ ๋ํด ๋ฐฉ๋ฌธํ์ง ์์ ์ ์๊ณ , ๋ฌธ์ ์ ์กฐ๊ฑด์์์ฒ๋ผ ๊ฐ์ ์ํ๋ฒณ์ ๋ ๋ฒ ๋ฐฉ๋ฌธํ๋ ์ผ๋ ์์ ์ ์๋ค.
import java.util.*;
import java.io.*;
public class Main {
static char[][] board;
static int answer = 0;
static boolean[] alpha = new boolean[26];
static int R;
static int C;
static final int GAP = 'A';
static int[][] direction = new int[][] {{0, 1}, {1, 0}, {-1, 0}, {0, -1}};
public static void main(String[] args) throws IOException {
Scanner sc = new Scanner(System.in);
R = sc.nextInt();
C = sc.nextInt();
board = new char[R][C];
for (int i = 0; i < R; i++) {
board[i] = sc.next().toCharArray();
}
alpha[board[0][0] - GAP] = true;
dfs(0, 0, 1);
System.out.println(answer);
}
private static void dfs(int x, int y, int count) {
answer = Math.max(answer, count);
int nx;
int ny;
char a;
for (int i = 0; i < 4; i++) {
nx = x + direction[i][0];
ny = y + direction[i][1];
if (nx < 0 || ny < 0 || nx >= R || ny >= C || alpha[board[nx][ny] - GAP]) continue;
a = board[nx][ny];
alpha[a - GAP] = true;
dfs(nx, ny, count+1);
alpha[a - GAP] = false;
}
}
}