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
'알고리즘(w.KOTLIN) > 탐색' 카테고리의 다른 글
[백준][코틀린][1062] 가르침 (0) | 2023.03.10 |
---|---|
[백준][코틀린][14225] 부분수열의 합 (0) | 2023.03.10 |
[백준][코틀린][9663] N-Queen (0) | 2023.03.07 |
[백준][코틀린][15658] 연산자 끼워넣기(2) (0) | 2023.03.03 |
[백준][코틀린][1339] 단어 수학 (0) | 2023.03.01 |