ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 1987 : 알파벳
    Solve Algorithms/BFS, DFS 2020. 5. 3. 18:59
    728x90

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


    문제

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

    말은 상하좌우로 인접한 네 칸 중의 한 칸으로 이동할 수 있는데, 새로 이동한 칸에 적혀 있는 알파벳은 지금까지 지나온 모든 칸에 적혀 있는 알파벳과는 달라야 한다. 즉, 같은 알파벳이 적힌 칸을 두 번 지날 수 없다.

    좌측 상단에서 시작해서, 말이 최대한 몇 칸을 지날 수 있는지를 구하는 프로그램을 작성하시오. 말이 지나는 칸은 좌측 상단의 칸도 포함된다.

    입력

    첫째 줄에 R과 C가 빈칸을 사이에 두고 주어진다. (1 ≤ R,C ≤ 20) 둘째 줄부터 R개의 줄에 걸쳐서 보드에 적혀 있는 C개의 대문자 알파벳들이 빈칸 없이 주어진다.

    출력

    첫째 줄에 말이 지날 수 있는 최대의 칸 수를 출력한다.


    접근

    • 모든 정점에 대해 체크를 진행하는 BFS 알고리즘보다는, 하나의 정점에 대해 끝까지 탐색하는 DFS 알고리즘을 이용하였다.
    • visit 배열의 크기를 26으로 하여, 알파벳의 방문 여부를 체크한다. 
    • 탐색 후, 더이상 탐색할 수 없을 때, 백트래킹이 일어나는 정점을 방문하지 않음(false)으로 해주어야 한다. 
    • 백트래킹에 관한 문제를 더 풀어볼 필요가 있을 것 같다.

    코드

    import java.util.*;
    import java.io.*;
     
    public class Main {
        static int R, C, MAX = 0;
        static char[][] map;
        static boolean[] visit;
        static int[] dx = { -1010 };
        static int[] dy = { 0-101 };
        
        public static void DFS(int X, int Y, int depth) {
            visit[map[X][Y] - 'A'= true;
     
            for (int i = 0; i < 4; i++) {
                int nextX = X + dx[i];
                int nextY = Y + dy[i];
                if (nextX >= 0 && nextY >= 0 && nextX < R && nextY < C) {
                    if (visit[map[nextX][nextY] - 'A'== false) {
                        DFS(nextX, nextY, depth + 1);
                    }
                }
            }
            visit[map[X][Y] - 'A'= false;
            MAX = Math.max(MAX, depth);
        }
     
        public static void main(String[] args) throws IOException {
     
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
     
            StringTokenizer st = new StringTokenizer(br.readLine(), " ");
     
            R = Integer.parseInt(st.nextToken());
            C = Integer.parseInt(st.nextToken());
     
            map = new char[R][C];
            visit = new boolean[26];
     
            for (int i = 0; i < R; i++) {
                char[] c=br.readLine().toCharArray();
                for (int j = 0; j < C; j++) {
                    map[i][j] = c[j];
                }
            }
     
            int depth = 1;
            DFS(001);
     
            bw.write(MAX+"\n");
     
            bw.flush();
            br.close();
     
        }
     
    }
    728x90

    'Solve Algorithms > BFS, DFS' 카테고리의 다른 글

    5014 : 스타트링크  (0) 2020.05.03
    6593 : 상범 빌딩  (0) 2020.05.03
    2589 : 보물섬  (0) 2020.04.28
    2573 : 빙산  (0) 2020.04.28
    3187 : 양치기꿍  (0) 2020.04.24

    댓글

kxmjhwn@gmail.com