Algorithm/백준

[골드4] 알파벳

sangyunpark 2023. 9. 5. 14:46

https://www.acmicpc.net/problem/1987

 

1987번: 알파벳

세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으

www.acmicpc.net

 

전형적인 완전탐색 문제이다..!

원상복구 처리가 핵심!

 

알파벳이 사용되므로, 아스키 코드를 활용해서 방문 처리를 해준다.

 

2번경로로 가기 위해서는 원상복구를 해주어야 한다.

 

 

풀이 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    public static int R;
    public static int C;

    public static String[][]map;

    // 북동서남
    public static int[] dx = new int[]{0,1,0,-1};
    public static int[] dy = new int[]{-1,0,1,0};

    public static int[] visited;

    public static char a = 'A';

    public static int answer = Integer.MIN_VALUE;

    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 String[R][C];
        visited = new int[26]; // 아스키 코드를 활용한 알파벳

        for (int i = 0; i < R; i++) {
            st = new StringTokenizer(br.readLine());
            map[i] = st.nextToken().split("");
        }

        visited[map[0][0].charAt(0) - a] = 1;

        dfs(0,0,1);

        System.out.println(answer);
    }

    public static void dfs(int y, int x, int cnt){

        answer = Math.max(answer,cnt);

        for (int i = 0; i < 4; i++) {

            int nx = x + dx[i];
            int ny = y + dy[i];

            if(nx < 0 || nx >= C || ny < 0 || ny >= R) continue;

            int next = map[ny][nx].charAt(0) - a;

            if(visited[next] == 0){ // 방문하지 않은 경우
                visited[next] = 1;
                dfs(ny, nx, cnt+1);
                visited[next] = 0; // 지나왔던 곳 방문처리 취소
            }
        }
    }
}