반응형
[알고리즘][DFS][1987] 알파벳
문제
https://www.acmicpc.net/problem/1987
풀이
문제 자체를 이해를 잘못 이해해서 몇 번을 헤맸다. DFS로 풀되 다른 케이스를 체크하기 위해 백트래킹을 이용해주면 더 쉽게 풀 수 있는 문제이다.
0,0 (좌측상단)에서 출발해 가장 멀리갈 수 있는 방법을 탐색하는 문제이다.
코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | package algorithm_DFS; import java.util.Scanner; public class q_1987 { static int r; static int c; static int[][] arr; static int[] check; static int[][] arr_check; static int dx[] = {-1, 1, 0, 0}; static int dy[] = {0, 0, -1, 1}; static int cnt = 0; static int max = 0; public static void dfs (int m, int n, int cnt) { if(max<cnt) max = cnt; for(int i=0;i<4;i++) { int nx = m + dx[i]; int ny = n + dy[i]; if(nx>=0 && nx<r && ny>=0 && ny<c) { int k = arr[nx][ny]; if(check[k]==0) { check[k]++; dfs(nx,ny,cnt+1); check[k]--; // 다른 경로도 탐색 가능하도록 다시 빼준다. } } } } public static void main(String[] args) { Scanner scan = new Scanner(System.in); r = scan.nextInt(); c = scan.nextInt(); scan.nextLine(); arr = new int[r][c]; check = new int['Z'-'A'+1]; for(int i=0;i<r;i++) { char[] tmp = scan.nextLine().toCharArray(); for(int j=0;j<c;j++) { char apb = tmp[j]; arr[i][j] = (int)apb-'A'; } } max = 0; check[arr[0][0]]++; dfs(0,0,1); System.out.println(max); } } | cs |
반응형
'CS > Algorithm' 카테고리의 다른 글
[알고리즘][DFS][2573] 빙산 (0) | 2018.05.01 |
---|---|
[알고리즘][DFS][14502] 연구소 (0) | 2018.04.25 |
[알고리즘][DFS][2468] 안전영역 (JAVA) (0) | 2018.04.23 |
[알고리즘][문자열][9933] 민균이의 비밀번호 (0) | 2018.04.21 |
[알고리즘][문자열][1764] 듣보잡 (0) | 2018.04.20 |
댓글