[백준 1987] 알파벳
728x90

문제


접근

  • DFS 탐색을 통해서 말을 이동할 수 있는 경로 탐색
    • 이때, alphabets 배열을 통해서 중복된 알파벳의 경로로 가지 않도록 해야 한다고 생각하였다.
    • alphabets 배열을 A~Z까지의 26의 크기를 가진 배열로 설정하였다.
    • 해당 알파벳의 정수 값에서 'A'의 정수값을 빼면 해당 알파벳의 인덱스 값이 되기 때문에 탐색한 경우 해당 배열 인덱스에 위치한 값을 true로 변환해주었다.
  • 백트래킹!!!!
    • 알파벳을 탐색하면서 중복 처리를 한 map에서 말의 움직임을 count한다.
    • 이때 다른 경로를 탐색하기 위해 중복 처리를 한 부분을 다시 원복시킨다.
    • 원복 시킨 것에서 다른 경로로 탐색하고 다시 중복처리를 진행하면서 말의 움직임을 또 count한다.
    • 탐색할 때마다 maxCount를 최댓값으로 갱신해주면서 최종 값을 구할 수 있다.


코드

import java.util.*;
import java.io.*;

public class Main {
    static char[][] map;
    static int R, C;
    static boolean[] alphabets;
    static int maxCount;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    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 char[R][C];
        alphabets = new boolean[26];
        for (int i = 0; i < R; i++) {
            String row = br.readLine();
            map[i] = row.toCharArray();
        }

        maxCount = 0;
        dfs(0, 0, 1);
        System.out.println(maxCount);

    }


    static void dfs(int x, int y, int count) {
        int index = map[x][y] - 'A';
        alphabets[index] = true;
        maxCount = Math.max(maxCount, count);

        for (int i = 0; i < 4; i++) {
            int nx = x + dx[i];
            int ny = y + dy[i];
            if (nx >= 0 && ny >= 0 && nx < R && ny < C && !alphabets[map[nx][ny] - 'A']) {
                dfs(nx, ny, count + 1);
            }
        }
        // 백트래킹
        alphabets[index] = false;

    }
}

 

728x90
반응형

'Study > Algorithm' 카테고리의 다른 글

[백준 5525] IOIOI  (1) 2024.09.03
[백준 9465] 스티커  (0) 2024.08.30
[백준 11726] 2*n 타일링  (0) 2024.08.30
[백준 11725] 트리의 부모 찾기  (0) 2024.08.30
[백준 14502] 연구소  (0) 2024.08.27