JAVA
백준 1987 JAVA
by Son
2024. 9. 12.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int R, C; //첫째 줄에 $R$과 $C$가 빈칸을 사이에 두고 주어진다
static int[][] map; //알파벳을 놓을 보드
static boolean[] visit = new boolean[26]; //알파벳은 26자이므로 26크기 알파벳을 지나갔는지 안지나갔는지 확인하기 위함
static int[] dx = { -1, 1, 0, 0 }; //상하좌우
static int[] dy = { 0, 0, -1, 1 };
static int ans = 0; //최대 지나간 값
public static void dfs(int x, int y, int count) {
if (visit[map[x][y]]) { // 0,0에 저장된 알파벳이 이미 한번 방문한 알파벳이라면,
ans = Math.max(ans, count); // 정답을 갱신해준다.
return; // 조건에 만족하므로 리턴.
} else {
visit[map[x][y]] = true; //해당 알파벳을 사용
for (int i = 0; i < 4; i++) { //상하좌우 for문
int cx = x + dx[i];
int cy = y + dy[i];
if (cx >= 0 && cy >= 0 && cx < R && cy < C) { //상하좌우로 도는 것에 대한 범위
dfs(cx, cy, count + 1);
}
}
visit[map[x][y]] = false;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
R = Integer.parseInt(st.nextToken()); //가로
C = Integer.parseInt(st.nextToken()); //세로
map = new int[R][C];
for (int i = 0; i < R; i++) {
String str = br.readLine();
for (int j = 0; j < C; j++) {
map[i][j] = str.charAt(j) - 'A'; //어떤 알파벳이 들어갔는지를 아스키 코드를 사용해서 저장
}
}
dfs(0, 0, 0);
// (0,0)부터 시작하며, 현재 이동한 위치는 0회
System.out.println(ans);
}
}