Competition/Baekjoon

[백준] 1987번 자바 알파벳

bisi 2020. 5. 4. 12:55
문제 출처 

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

 

1987번: 알파벳

문제 세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다. 좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는

www.acmicpc.net

 

 

 

접근 방식 및 풀이

- BFS, DFS 모두 사용가능하지만, BFS는 알파벳의 방문여부를 체크하기 까다롭다. 이부분에서 해매다가 결국 DFS 알고리즘을 적용하여 해결하였다.

 

 

 

 

소스 코드 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
 
public class Main {
 
    static char[][] map;
    static boolean[] visitcheckdfs;
    static int[] dx = {0,1,0,-1};
    static int[] dy = {1,0,-1,0};
    static int R, C;
    static int ans =1;
    static int cnt =1;
 
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
 
        C = Integer.parseInt(st.nextToken());
        R = Integer.parseInt(st.nextToken());
        map =new char[C][R];
        dist =new int[C][R];
        visited = new boolean[C][R];
        visitcheckdfs = new boolean[26];
 
        for (int i = 0; i < C; i++) {
            String input = br.readLine();
            for (int j = 0; j < R; j++) {
                map[i][j] = (char) (input.charAt(j) - 'A');
            }
        }
 
        dfs(map, visitcheckdfs, 0,0);
        System.out.println(ans);
    }
    
    private static void dfs(char[][] map, boolean[] visited , int x, int y){
        int idx = map[x][y];
        visited[idx] = true;
 
        for (int i = 0; i <4 ; i++) {
            int next_x = x + dx[i];
            int next_y = y + dy[i];
            if(next_x>=0 && next_y>=0 && next_x < C&& next_y < R ){
                int tmpnextxy = map[next_x][next_y];
                if(!visitcheckdfs[tmpnextxy]){
                    ans = Math.max(++cnt, ans);
                    dfs(map, visitcheckdfs, next_x, next_y);
                }
            }
        }
        --cnt;
        visitcheckdfs[idx] = false;
    }
 
}
 

 

 

결과