티스토리 뷰

알고리즘/백준

[백준] 1987번 알파벳

머어하지 2018. 8. 27. 15:24

1) 생각

알파벳이 각각 적혀있는 R행 C열이 주어졌을 때, (0,0)에서 출발하여 알파벳이 중복되지 않게 최대한 갈 수 있는 칸을 출력하라.


처음 생각

칸을 나아가야 하므로 DFS를 풀이를 해야한다고 생각하였다. 지나간 길에있는 알파벳이 딱 한 번만 나와야 하므로 String 변수에 해당 알파벳을 더해가면서 contains 메소드를 통해 이번에 탐색한 알파벳이 이전에 있었는지 검사하였다.

String 객체를 넘겨주면 검사를 하다보니 시간과 메모리를 크게 잡아먹었다.


▶ 시간도 그렇고 메모리도 18배 정도 차이가 난다.



2) 방안

1) String으로 된 매개변수를 없애고 boolean형 visited 배열을 만들어 주어 해당 알파벳의 위치를 체크하였다.

▶ 다음 탐색을 위해 해당 재귀가 종료될 시 false로 바꿔줬다.


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
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
 
public class Main{
    static int r,c;
    static char[][] arr;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        r = Integer.parseInt(st.nextToken());
        c = Integer.parseInt(st.nextToken());
        arr = new char[r][c];
        for(int i=0;i<r;i++) {
            String t = br.readLine();
            for(int j=0;j<c;j++)
                arr[i][j] = t.charAt(j);
        }
        visited = new boolean[91];
        solve(0,0,1);
        System.out.println(result);
    }
    
    static int result = 0;
    static boolean[] visited;
    static int[][] dir = {{1,0},{0,1},{-1,0},{0,-1}};
    private static void solve(int x,int y,int cnt) {
        visited[arr[x][y]] = true;
        result = Math.max(cnt, result);
        for(int i=0;i<4;i++) {
            int tx = x+dir[i][0];
            int ty = y+dir[i][1];
            if(tx<0 || ty<0 || tx>=|| ty>=c) continue;
            if(visited[arr[tx][ty]]) continue;
            solve(tx,ty,cnt+1);
        }
        visited[arr[x][y]] = false;
    }
}
cs


'알고리즘 > 백준' 카테고리의 다른 글

[백준] 1237번 정ㅋ벅ㅋ  (0) 2018.08.27
[백준] 11723번 집합  (0) 2018.08.27
[백준] 11403번 경로 찾기  (0) 2018.08.27
[백준] 9663번 N-Queen  (0) 2018.08.22
[백준] 14501번 퇴사  (4) 2018.08.22
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday