Question
문제 해설
- R x C인 배열이 존재한다. 이 배열 안에는 하나의 알파벳이 들어가 있다.
- (0, 0)부터 시작해서 상, 하, 좌, 우 방향으로 움직인다.
- 다음 칸으로 움직일 때, 이전에 방문했던 칸의 알파벳과 같은 알파벳이 나오면 안된다.
- 움직일 수 있는 최대의 칸은?
Solution
풀이 접근 방법
- 말이 최대한 몇 칸을 지날 수 있는지 = DFS(백트레킹)
- 하나의 알파벳이 담긴 표 모양의 보드 = char 배열 사용
- 인접한 상, 하, 좌, 우로 이동 가능 = int[] dx, dy 사용하여 이동 제한
- 이번에 방문했던 알파벤 나오면 안됨 = 나왔던 값들은 Set에 넣어서 확인
- 방문 확인을 위해 주로 사용하던 boolen 배열 사용할 필요 없음
정답 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.HashSet;
import java.util.Set;
public class Main_1987 {
static int C, R;
static char[][] map;
static int[] dx = { 0, 0, 1, -1 }, dy = { 1, -1, 0, 0 };
static int maxDepth = -1;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
String[] info = br.readLine().split(" ");
R = Integer.valueOf(info[0]);
C = Integer.valueOf(info[1]);
map = new char[R][C];
for (int i = 0; i < map.length; i++) {
map[i] = br.readLine().toCharArray();
}
Set<Character> set = new HashSet<Character>();
set.add(map[0][0]);
move(0, 0, set, 1);
bw.write(maxDepth + "\n");
bw.flush();
bw.close();
}
static void move(int x, int y, Set<Character> set, int depth) {
for (int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if (!isIn(nx, ny) || set.contains(map[nx][ny])) {
maxDepth = Math.max(maxDepth, depth);
continue;
}
set.add(map[nx][ny]);
move(nx, ny, set, depth + 1);
set.remove(map[nx][ny]);
}
}
static boolean isIn(int x, int y) {
if (0 <= x && x < R && 0 <= y && y < C) {
return true;
}
return false;
}
}