최대로 이동할 수 있는 칸은 20*20 = 400으로 크지 않고
상태 비교만 하면 되기 때문에 완전 탐색으로 문제 해결이 가능하다.
단, 최장경로이기 때문에 현재 탐색이 끝났을 때 지금까지의 max 경로길이와 비교하여 업데이트 해주고 모든 탐색이 끝날 때까지 종료하면 안된다.
상태 저장은 각 알파벳의 아스키코드를 이용하였고 A가 65이기 때문에 -65를 해주어 0-25 인덱스에 저장할 수 있도록 설정하였다.
import java.util.Scanner; public class Main { static int max=0; public static void Alph(char[][] arr, boolean[] check, int idx, int count){ int x=idx/arr[0].length; int y=idx%arr[0].length; if(max<count) //최장경로 업데이트 max=count; if(x>0 && check[(int)(arr[x-1][y])-65]==false){//위로 갈 수 있는지? check[(int)(arr[x-1][y])-65]=true; Alph(arr,check, idx-arr[0].length, count+1); check[(int)(arr[x-1][y])-65]=false; } if(y<arr[0].length-1 && check[(int)(arr[x][y+1])-65]==false){//오른쪽으로 갈 수 있는지? check[(int)(arr[x][y+1])-65]=true; Alph(arr,check, idx+1, count+1); check[(int)(arr[x][y+1])-65]=false; } if(y>0 && check[(int)(arr[x][y-1])-65]==false){//왼쪽으로 갈 수 있는지? check[(int)(arr[x][y-1])-65]=true; Alph(arr,check, idx-1, count+1); check[(int)(arr[x][y-1])-65]=false; } if(x<arr.length-1 && check[(int)(arr[x+1][y])-65]==false){//아래로 갈 수 있는지? check[(int)(arr[x+1][y])-65]=true; Alph(arr,check, idx+arr[0].length, count+1); check[(int)(arr[x+1][y])-65]=false; } } public static void main(String[] args) { Scanner scan=new Scanner(System.in); int R=scan.nextInt(); int C=scan.nextInt(); scan.nextLine(); char[][] arr=new char[R][C]; for(int i=0; i<R; i++){ String line=scan.nextLine(); for(int j=0; j<C; j++){ arr[i][j]=line.charAt(j); } } boolean[] check=new boolean[26]; check[(int)(arr[0][0])-65]=true; Alph(arr,check, 0, 1); System.out.println(max); } }
'이론 > 문제풀이' 카테고리의 다른 글
[백준 알고리즘 - 1261] 알고스팟 (java, BFS) (0) | 2018.09.04 |
---|---|
[백준 알고리즘 -1182] 부분집합의 합 - java(재귀호출/부제:오랜만에 삽질일기) (0) | 2018.09.01 |
[백준 알고리즘 -2580] 스도쿠 - java (백트래킹) (0) | 2018.08.31 |
[백준 알고리즘 - 9663] N-Queen - java(재귀호출, 백트래킹) (0) | 2018.08.28 |
[백준 알고리즘 - 1579] 암호만들기 -java(재귀) (0) | 2018.08.28 |