Baekjoon Online Judge

[BOJ] 1987 : 알파벳 (Java)

morenow 2023. 10. 26. 03:28

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

 

1987번: 알파벳

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

www.acmicpc.net

걸린 시간 : 23분 22초


전형적인 백트래킹 문제이다. 단, 재귀함수 호출 시 알파벳을 지나갔는지에 대한 검사도 해야 한다.

이 검사에는 HashSet 자료구조를 썼다.

정답 코드

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

public class BOJ1987 {

    static int R, C;
    static String[] board = new String[21];
    static boolean[][] vis = new boolean[21][21];
    static int answer = 1;
    static int pass = 1;
    static HashSet<Character> hashSet = new HashSet<>();
    static int[] di = {-1, 0, 0, 1};
    static int[] dj = {0, -1, 1, 0};

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        R = Integer.parseInt(input[0]);
        C = Integer.parseInt(input[1]);
        for (int i = 0; i < R; i++) {
            board[i] = br.readLine();
        }
        vis[0][0] = true;
        hashSet.add(board[0].charAt(0));
        dfs(0, 0);
        System.out.println(answer);
    }

    private static void dfs(int ci, int cj) {
        for (int k = 0; k < 4; k++) {
            int ni = ci + di[k];
            int nj = cj + dj[k];
            if (ni < 0 || ni >= R || nj < 0 || nj >= C || vis[ni][nj]) continue;
            if (hashSet.contains(board[ni].charAt(nj))) continue;
            pass++;
            answer = Math.max(pass, answer);
            vis[ni][nj] = true;
            hashSet.add(board[ni].charAt(nj));
            dfs(ni, nj);
            pass--;
            vis[ni][nj] = false;
            hashSet.remove(board[ni].charAt(nj));
        }
    }
}