본문 바로가기

PS

[BOJ] 1987번 : 알파벳

https://www.acmicpc.net/problem/1987

 

1987번: 알파벳

세로 R칸, 가로 C칸으로 된 표 모양의 보드가 있다. 보드의 각 칸에는 대문자 알파벳이 하나씩 적혀 있고, 좌측 상단 칸 (1행 1열) 에는 말이 놓여 있다. 말은 상하좌우로 인접한 네 칸 중의 한 칸으

www.acmicpc.net

 

 

 

분류 : DFS, 백트래킹

 

더보기
public class Main {
    static Myscanner sc = new Myscanner();
    static PrintWriter out = new PrintWriter(new BufferedOutputStream(System.out));
    static final int inf = 987654321;
    static char[][] alpha;

    static int N, M, ml = 0;

    public static void main(String[] args) {
        N = sc.nextInt();
        M = sc.nextInt();
        alpha = new char[N][M];
        for (int r = 0; r < N; r++) {
            alpha[r] = sc.nextLine().toCharArray();
        }
        DFS(0, 0, "");
        out.println(ml);
        out.close();
    }

    private static void DFS(int r, int c, String str) {
        
        if(ml<str.length()){
            ml = str.length();
        }
        if (r < 0 || r >= N || c < 0 || c >= M  || str.contains(alpha[r][c]+""))
            return;
        
        str += alpha[r][c];
        DFS(r + 1, c, str);
        DFS(r - 1, c, str);
        DFS(r, c + 1, str);
        DFS(r, c - 1, str);
    }
}

 

처음에 visited 배열과 str을 둘 다 쓰니 제출하자마자 바로 틀렸다..ㅠ.ㅠ

뭐가 문제지 하고서 디버깅을 하며 출력해보니까 DFS를 돌면서 이상한 값이 나오기에 visited 배열은 제거하고 String 만을 이용해서 DFS를 구현하니 통과 완료..

하지만 제일 빠른 코드와 내 코드의 시간 격차가 어마어마 하더라..

 

제일 빠른 분은 132ms로 거의 10배가 차이가 난다.

그분의 코드를 참조하여 좀 더 최적화하는 연습을 해야겠다.

 

'PS' 카테고리의 다른 글

[BOJ] 1145번 : 적어도 대부분의 배수  (0) 2017.06.23
[BOJ] 9517번 : 아이 러브 크로아티아  (0) 2017.06.13
[BOJ] 2468번: 안전 영역  (0) 2017.06.09
[BOJ] 2583번: 영역 구하기  (0) 2017.06.08
[BOJ] 11049번: 행렬 곱셈 순서  (0) 2017.06.08