1 λΆ„ μ†Œμš”

πŸ“ [G4_1987] μ•ŒνŒŒλ²³

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

public class Main {
    static StringTokenizer st;
    static int[] dx = {0, 1, 0, -1};
    static int[] dy = {1, 0, -1, 0};
    static int R, C;
    static boolean[][] isChecked;
    static int nx,ny;
    // 총 횟수 μΉ΄μš΄νŒ…
    static int cnt;
    static int max = Integer.MIN_VALUE;
    static boolean[] alp;
    static char[][] arr;
    static int i =0;

    public static void main(String[] args) throws IOException {


        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();

        st = new StringTokenizer(br.readLine(), " ");

        // μ„Έλ‘œ
        R = Integer.parseInt(st.nextToken());

        // κ°€λ‘œ
        C = Integer.parseInt(st.nextToken());

        // μž…λ ₯κ°’ μ €μž₯
        arr = new char[R][C];

        // μ§€λ‚˜κ°”λŠ”μ§€ 체크
        isChecked = new boolean[R][C];

        // 수 체크
        alp = new boolean[26];

        // λ°°μ—΄ μž…λ ₯
        for (int i = 0; i < R; i++) {
            String str = br.readLine();
            for (int j = 0; j < C; j++) {
                arr[i][j] = str.charAt(j);
            }
        }

        check(0,0);
        System.out.println(max);
    }

    static void check(int x, int y) {
        if(x < 0 || x == R || y < 0 || y == C ||  alp[(arr[x][y]-65)] == true) {
            return;
        }

        // 방문을 μ•ˆν–ˆμœΌλ©΄ true둜 λ°”κΏ”μ£Όκ³  ν•˜λ‚˜ μΉ΄μš΄νŒ…

        alp[(arr[x][y]-65)] = true;
        cnt++;

        max = Math.max(max, cnt);


        for (int z = 0; z < 4; z++) {
            nx = dx[z] + x;
            ny = dy[z] + y;

            check(nx,ny);
        }
        alp[(arr[x][y]-65)] = false;
        cnt--;
    }
}

πŸ€” λ‚˜μ˜ 생각

문제λ₯Ό 보고 λ¨Όμ € μˆœμ„œκ°€ 상관이 있기 λ•Œλ¬Έμ— μˆœμ—΄λ‘œ ν’€μ–΄μ•Ό κ² λ‹€λŠ” 생각이 λ“€μ—ˆλ‹€.
그리고 μ•ŒνŒŒλ²³μ΄ μ‚¬μš©λ˜μ—ˆλŠ”μ§€ 유무λ₯Ό νŒŒμ•…ν•˜κΈ° μœ„ν•΄ 26개의 μ›μ†Œλ₯Ό 가진 boolean λ°°μ—΄κ³Ό 계산을 μ•„μŠ€ν‚€μ½”λ“œλ₯Ό μ΄μš©ν•˜μ—¬ 0->A, 1->B .. μ΄λŸ°μ‹μœΌλ‘œ μ •ν•΄μ£Όμ—ˆλ‹€.
그리고 μž¬κ·€λ‘œ κ°”λ‹€μ™€μ„œλŠ” λ°±νŠΈλž˜ν‚Ήμ„ 톡해 μ’€ 더 효율적인 μ½”λ“œλ₯Ό μž‘μ„±ν•˜μ˜€λ‹€.
처음 μœ„μΉ˜λΆ€ν„° 4λ°©ν–₯ 탐색을 톡해 λ‹€μŒ μ›μ†Œλ₯Ό μ •ν•΄μ£Όμ—ˆλ‹€.
κ²°λ‘ μ μœΌλ‘œλŠ” DFS와 λ°±νŠΈλž˜ν‚Ήμ— λŒ€ν•΄ μ’€ 더 κ³΅λΆ€ν•˜κ²Œ λ˜λŠ” λ¬Έμ œμ˜€λ‹€.