본문 바로가기
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);
	}
}

'JAVA' 카테고리의 다른 글

백준 14225 JAVA  (0) 2025.01.26
백준 14501 JAVA  (2) 2024.10.07
백준 4574 Java  (0) 2024.07.19
백준 2580번 JAVA  (1) 2024.07.15
백준 9663번 JAVA  (0) 2024.06.30