보드 - 세로 R, 가로 C (1<=R,C<=20)
보드 각 칸 - 대문자 알파벳
DFS(int r, int c, int L)
import java.util.*;
public class Main {
static int[] dr = {-1, 0, 1, 0};
static int[] dc = {0, 1, 0, -1};
static int answer = Integer.MIN_VALUE; //정답 저장할 변수
//입력받을 변수
static int R, C;
static int[][] board;
//중복을 체크할 배열
static boolean[] ch;
public static void main(String[] args){
//중복 알파벳을 체크할 배열 'Z'의 값은 90이다.
ch = new boolean[91];
Scanner scanner = new Scanner(System.in);
//입력을 받는다.
R = scanner.nextInt();
C = scanner.nextInt();
board = new int[R][C];
for(int i=0; i<R; i++){
String next = scanner.next();
for(int j=0; j<C; j++){
board[i][j] = next.charAt(j);
}
}
//깊이 우선 탐색
ch[board[0][0]] =true;
DFS(0, 0, 1);
System.out.println(answer);
}
static void DFS(int r, int c, int L){
//이동 가능한 방향을 찾는다.
ArrayList<Integer> direction = canMoveDirection(r, c);
//이동 가능 방향이 없으면 정답 갱신 후, 탐색 종료
if(direction.size()==0) {
answer = Math.max(answer, L);
return ;
} else {
//이동 가능한 방향으로 탐색
for (Integer i : direction) {
int nr = r + dr[i];
int nc = c + dc[i];
ch[board[nr][nc]] = true;
DFS(nr, nc, L + 1);
ch[board[nr][nc]] = false;
}
}
}
//이동 가능한 방향을 찾아서 반환해주는 함수
private static ArrayList<Integer> canMoveDirection(int r, int c){
ArrayList<Integer> direction = new ArrayList<>();
for(int i=0; i<4; i++){
int nr = r + dr[i];
int nc = c + dc[i];
if(nr<0 || nr>=R || nc<0 || nc>=C) continue;
if(ch[board[nr][nc]]) continue;
direction.add(i);
}
return direction;
}
}