-
[백준]1987: 알파벳 - JAVA문제풀이/백준 2021. 2. 23. 17:50
[백준]1987: 알파벳
1987번: 알파벳
세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으
www.acmicpc.net
풀이
백트랙킹 + DFS문제이다.
이전에 알파벳을 뽑았는지 확인하기 위해 알파벳의 개수만큼의 크기의 배열을 boolean타입으로 만들어주었다.
그리고 dfs탐색을 하면서 이전에 뽑은 알파벳이 아닌 경우에 탐색을 진행하도록 하였다.
알파벳을 처리하는 방법 즉, boolean배열로 방문 노드를 표시하듯이 알파벳을 처리해주는 아이디어만 생각해 낸다면 이후로는 기존의 dfs탐색 풀이와 똑같다.
코드
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748import java.util.*;public class Main {static int r, c;static int[][] board;static int[] dx = {-1, 0, 1, 0};static int[] dy = {0, 1, 0, -1};static int max = 0;static boolean[] alpha;public static void main(String[] args) {Scanner scan = new Scanner(System.in);r = scan.nextInt();c = scan.nextInt();scan.nextLine();//board를 입력받는다.board = new int[r][c];for(int i = 0; i < r; i++) {String str = scan.nextLine();for(int j = 0; j < c; j++) {board[i][j] = str.charAt(j) - 'A';}}alpha = new boolean[26]; //알파벳을 이전에 방문했는지 여부 체크.backtracking(0, 0, 1);System.out.println(max);}public static void backtracking(int x, int y, int len) {alpha[board[x][y]] = true;max = Math.max(max, len);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) {if(alpha[board[nx][ny]] == false) {backtracking(nx, ny, len + 1);alpha[board[nx][ny]] = false;}}}}}cs '문제풀이 > 백준' 카테고리의 다른 글
[백준]1167: 트리의 지름 - JAVA (5) 2021.02.25 [백준]13549: 숨바꼭질 3 - JAVA (0) 2021.02.24 [백준]2573: 빙산 - JAVA (0) 2021.02.22 [백준]14502: 연구소 - JAVA (0) 2021.02.21 [백준]1937: 욕심쟁이 판다 -JAVA (0) 2021.02.21