Post

[백준/코틀린] 1987번: 알파벳

골드 4

링크

1987번: 알파벳

풀이

백트래킹을 통해 현재까지 방문하지 않은 알파벳이 있는 칸을 탐색합니다.
동일한 알파벳은 다시 방문할 수 없으므로, visited는 좌표가 아닌 알파벳 방문 여부로 관리합니다.

각 칸에서 최대 4방향으로 확장하는 지수 시간 DFS이지만, ($O(4^k)$, $k \le 26$)
알파벳 개수(26)가 최대 경로 길이를 제한해 실제 탐색 범위는 크게 줄어듭니다.

코드

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
lateinit var board: List<String>
val visited = BooleanArray('Z'.code + 1)
val dy = listOf(-1, 0, 1, 0)
val dx = listOf(0, 1, 0, -1)
var ans = 0

fun backtrack(n: Int, m: Int, cy: Int, cx: Int, cd: Int) {
    ans = maxOf(ans, cd)

    visited[board[cy][cx].code] = true
    repeat(4) {
        val ny = cy + dy[it]
        val nx = cx + dx[it]
        val nd = cd + 1

        if (ny in 0 until n &&
            nx in 0 until m &&
            !visited[board[ny][nx].code]
        ) {
            backtrack(n, m, ny, nx, nd)
        }
    }
    visited[board[cy][cx].code] = false
}

fun main() {
    val (r, c) = readln().split(" ").map { it.toInt() }
    board = List(r) { readln() }

    backtrack(r, c, 0, 0, 1)

    println(ans)
}

This post is licensed under CC BY 4.0 by the author.