728x90


문제 탐색
- 좌측 상단 칸에 위치한 말이 알파벳 보드를
- 상하좌우로 이동하면서
- 최대한 몇 칸을 지날 수 있는지 출력 => 칸을 지날때마다 거리 체크
- 새로 이동한 칸의 알파벳은 지나온 모든 칸의 알파벳과 겹치면 안된다 => 알파벳 방문 처리
1.
public class Main {
static int r, c, maxLen = 0; //세로 길이 r, 가로 길이 c, 최대 칸 maxLen
static char[][] arr; //알파벳 보드 입력
static boolean[] visited = new boolean[26]; // 알파벳 A~Z 방문 여부
static int[] dx = {0, 0, 1, -1};
static int[] dy = {1, -1, 0, 0};
2.
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());
arr = new char[r][c];
for (int i = 0; i < r; i++) { //알파벳 보드 입력
String[] s = br.readLine().split("");
for (int j = 0; j < c; j++) {
arr[i][j] = s[j].charAt(0);
}
}
dfs(0,0,1); //말이 위치한다고 했던 가장 왼쪽 0,0 부터 dfs 순회 시작
System.out.println(maxLen);
}
public static void dfs(int i, int j, int depth) {
int alpaIdx = arr[i][j] - 'A'; //알파벳을 인덱스로 방문 관리
visited[alpaIdx] = true; //방문처리
maxLen = Math.max(maxLen, depth);//가장 긴 탐색 칸 수 저장
for (int k = 0; k < 4; k++) {
int nx = i + dx[k];
int ny = j + dy[k];
if(nx>=0 && nx<r && ny>=0 && ny<c) { //나아갈 칸이 보드 규격에 속하는지
int nextAlpaIdx = arr[nx][ny] - 'A';
if(!visited[nextAlpaIdx]) { //나아갈 칸의 알파벳이 아직 방문전인지
dfs(nx, ny, depth+1); //칸 전진
visited[nextAlpaIdx] = false; //dfs 재귀가 종료되면 방문 반환
}
}
}
}
백트래킹
깊이 우선 탐색, 더 이상 나아갈 수 없는 상황에서 그 이전 단계로 복귀하는 과정




완전탐색 추천 문제집
https://www.acmicpc.net/workbook/view/2052
728x90
'백준' 카테고리의 다른 글
| [JAVA] 백준 골드 3 11437 백준 최소 공통 조상(LCA: Lowest Common Ancestor) (2) | 2025.06.10 |
|---|---|
| 그리디(Greedy) 알고리즘 (0) | 2023.07.15 |
| 백준 10814번 C++ pair, stable_sort 사용해서 해결 (0) | 2023.07.05 |
| 백준 1463번 C++ , 다이나믹 프로그래밍으로 풀기 (0) | 2023.06.29 |
| [자료구조] 스택(STACK), 큐(QUEUE) (0) | 2023.06.21 |