BOJ_알파벳_1987 (Java)

융바오·2024년 12월 26일

Problem Solving

목록 보기
15/89

문제 링크

성능 요약

메모리: 15136 KB, 시간: 860 ms

분류

백트래킹, 깊이 우선 탐색, 그래프 이론, 그래프 탐색

제출 일자

2024년 12월 22일 21:15:57

문제 설명

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

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

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

입력

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

출력

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

풀이

느낀점

  • 그냥 방문체크를 따로하는 dfs같은데 왜 골드4일까

설계 : 5분

  • 알파벳 26개의 방문체크를 하는 visited를 생성한다.
  • board에는 각 알파벳에서 ‘A’ 아스키코드값을 빼서 0~25의 인덱스를 입력하도록 한다.
  • 시작지점부터 dfs를 통해 가장 많이 갈 수 있는 지점까지의 이동 거리를 갱신한다.

코드(Java)

  • 구현 시간: 30분
/**
 * Author: yngbao97, Yuk Yejin
 * Problem: 알파벳_1987
 * Date: 2024.12.22
 */

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

public class Main {
	static BufferedReader br;
	static BufferedWriter bw;
	static StringTokenizer st;
    static int n;
    static int m;
    static int[][] board;
    static boolean[] visited;
    static int max;

    static int[] dr = {-1, 0, 1, 0};
    static int[] dc = {0, 1, 0, -1};

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

		br = new BufferedReader(new InputStreamReader(System.in));
		bw = new BufferedWriter(new OutputStreamWriter(System.out));

        String[] input = br.readLine().split(" ");
        n = Integer.parseInt(input[0]);
        m = Integer.parseInt(input[1]);
        board = new int[n][m];

        for (int i = 0; i < n; i++) {
            char[] line = br.readLine().toCharArray();
            for (int j = 0; j < m; j++) {
                board[i][j] = line[j] - 'A';
            }
        }

        visited = new boolean[26];
        visited[board[0][0]] = true;
        max = 0;
        dfs(0, 0, 1);

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

    public static void dfs(int row, int col, int cnt) {

        for (int i = 0; i < 4; i++) {
            int nr = row + dr[i];
            int nc = col + dc[i];

            if (nr >= n || nr < 0 || nc >= m || nc < 0 || visited[board[nr][nc]]) continue;

            visited[board[nr][nc]] = true;
            dfs(nr, nc, cnt + 1);
            visited[board[nr][nc]] = false;
        }

        max = Math.max(max, cnt);
    }
}

0개의 댓글