728x90
[Java] 백준 1987 : 알파벳
알파벳 적힌 칸을 한 번씩만 지나서 최대한 몇 칸을 움직일 수 있는가를 구현한다.
DFS로 구현할 경우, 각각의 루트에 대해서 지나갈 수 있는 값들 중 최댓값을 출력할 수 있도록 해야한다.
특정 루트에 대한 탐색이 끝나면 다음 루트에 대한 탐색도 온전하게 진행되어야 하므로,
dfs의 재귀가 끝날 때 해당 알파벳에 대한 방문 처리를 초기화 해주어야 한다.
방문 처리를 초기화 해주지 않으면 다음 루트에 대한 탐색에 문제가 생기기 때문이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
static int R, C;
static int dx[] = { -1, 1, 0, 0 };
static int dy[] = { 0, 0, -1, 1 };
static int [][] map;
static boolean [] visited = new boolean[26]; // 알파벳 개수
static int answer = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// 입력한 값 map에 할당
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);
System.out.println(answer);
}
public static void dfs(int i, int j, int count) {
if (visited[map[i][j]]) { // 방문을 했었다면
answer = Math.max(answer, count); // 정답을 갱신하고 리턴
}
else {
visited[map[i][j]] = true;
for (int k = 0; k < 4; k++) {
int x = i + dx[k];
int y = j + dy[k];
if (x >= 0 && y >= 0 && x < R && y < C) {
dfs(x, y, count + 1);
}
}
visited[map[i][j]] = false;
}
}
}
728x90
'알고리즘 문제 풀이' 카테고리의 다른 글
[Java] 백준 2206 : 벽 부수고 이동하기 (0) | 2023.07.20 |
---|---|
[Java] 백준 14226 : 이모티콘 (0) | 2023.07.20 |
[Java] 백준 2667 : 단지번호붙이기 (0) | 2023.07.13 |
[Java] 백준 2504 : 괄호의 값 (0) | 2023.05.25 |
자바 코테용 문법 정리 (2) | 2023.05.02 |