본문 바로가기

알고리즘(w.KOTLIN)/탐색

[백준][코틀린][1987] 알파벳

728x90

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

 

1987번: 알파벳

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

www.acmicpc.net

문제 풀이

1. 주어진 입력을 저장하는 board 2차원 배열을 선언한다.

2. 이전 경로를 방문했는 지 여부를 확인하는 visit 배열을 선언한다. index 는 {현재 알파벳 - 'A'} 로 구한다.

3. result 에 최대값을 저장한다.

코드

import java.io.*

private var result = Int.MIN_VALUE

fun main(args: Array<String>) {
    val br = BufferedReader(InputStreamReader(System.`in`))
    val (R, C) = br.readLine().split(" ").map { it.toInt() }
    val board = Array(R) { CharArray(C) { '0' } }
    repeat(R) {
        board[it] = br.readLine().toCharArray()
    }

    val visit = BooleanArray('Z' - 'A' + 1) { false }
    visit[board[0][0] - 'A'] = true
    dfs(board, visit, 0, 0, 1, R, C)
    println(result)
}

private fun dfs(board: Array<CharArray>, visit: BooleanArray, x: Int, y: Int, count: Int, R: Int, C: Int) {
    val dX = intArrayOf(-1, 1, 0, 0)
    val dY = intArrayOf(0, 0, -1, 1)
    result = Math.max(result, count)

    for (i in 0..3) {
        val nX = x + dX[i]
        val nY = y + dY[i]

        if ((nX < 0 || nX >= R) || (nY < 0 || nY >= C)) continue
        if (visit[board[nX][nY] - 'A']) continue

        visit[board[nX][nY] - 'A'] = true
        dfs(board, visit, nX, nY, count + 1, R, C)
        visit[board[nX][nY] - 'A'] = false
    }
}
728x90