본문 바로가기
Problem Solving/Baekjoon

[백준] 1987 알파벳 - Backtracking / Java

by graycode 2022. 9. 23.

 문제 링크

 

1987번: 알파벳

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

www.acmicpc.net

 

 풀이 과정

 

 풀이 코드

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

public class Main {

    static int r, c, max;
    static char[][] mat;
    static boolean[] visit;
    static int[][] dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};

    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());

        if (r == 1 && c == 1) max = 1;
        else {
            mat = new char[r][c];
            visit = new boolean[26];
            for (int i = 0; i < r; i++) mat[i] = br.readLine().toCharArray();

            recur(0, 0, 0);
        }


        bw.write(String.valueOf(max));
        bw.flush();
    }

    private static void recur(int y, int x, int cnt) {
        int idx = mat[y][x] - 'A';

        if (visit[idx]) {
            max = Math.max(max, cnt);
            return;
        }

        visit[idx] = true;
        for (int[] d : dir) {
            int ny = y + d[0], nx = x + d[1];
            if (ny >= 0 && ny < r && nx >= 0 && nx < c) recur(ny, nx, cnt + 1);
        }
        visit[idx] = false;
    }

}

댓글