평소에 최대/최소값 구하는 문제에서 초기값을 Integer.MAX_VALUE, Integer.MIN_VALUE로 줘서 이 문제도 아무 생각없이 result = Integer.MIN_VALUE로 설정했다.
그런데 이 문제에서는 최대값이 최소 1이었고, 이 경우에 최대값을 바꿔주는 부분이 내 코드에 없어서 테스트케이스에서 오류가 났다!!!
오류를 찾는데 스터디원들의 도움을 받았다
import java.util.*;
import java.io.*;
public class Main {
// 좌측 상단 칸(1행,1열)에는 말이 놓임
// 말은 상하좌우 이동 가능
// 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과 달라야 한다.
// 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.
// 좌측상단 칸도 포함, 최대 몇 칸 지날 수 있는지 구하기
static int R, C, result;
static char[][] board;
static int[] dr = { -1, 0, 1, 0 }; // 상우하좌
static int[] dc = { 0, 1, 0, -1 };
static boolean[][] v; // 방문했는지
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
R = Integer.parseInt(st.nextToken());
C = Integer.parseInt(st.nextToken());
board = new char[R][C];
for (int i = 0; i < R; i++) {
String str = br.readLine();
for (int j = 0; j < C; j++) {
board[i][j] = str.charAt(j);
}
}
v = new boolean[R][C];
result = 1; // 초기값 주의하기
dfs(0, 0, board[0][0] + "");
System.out.println(result);
br.close();
}
static void dfs(int r, int c, String str) {
v[r][c] = true;
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
// 범위 안에 들어오고, 방문 안 했고,
if (0 <= nr && nr < R && 0 <= nc && nc < C && !v[nr][nc]) {
char ch = board[nr][nc]; // 이동할 곳의 알파벳이
if (!str.contains(ch + "")) { // 이전 꺼에 포함되어있지 않다면
result = Math.max(result, str.length() + 1);
// 재귀를 타고 돌아왔을 때 str에 변화가 있으면 안되므로
// str = str+ch; 하지않고 아래와 같이 보냄
v[nr][nc] = true;
dfs(nr, nc, str + ch);
v[nr][nc] = false;
}
}
}
// 네 곳 다 확인했는데 갈 곳 없으면,
return;
}
}