-
[백준] 2589 보물섬 Kotlin개발/알고리즘 2023. 4. 13. 17:19
https://www.acmicpc.net/problem/2589
목표가 정해져있지 않는 최단거리 문제이다. 모든 지점마다 bfs를 돌리고 최대값을 return 하는 방식으로 접근했다. bfs를 돌 때마다 visited 배열을 false로 초기화한다.
import java.io.BufferedReader import java.io.InputStreamReader import java.util.LinkedList import java.util.Queue import kotlin.math.max var graph: Array<CharArray> = arrayOf() var visited: Array<BooleanArray> = arrayOf() val dx = intArrayOf(1, 0, -1, 0) val dy = intArrayOf(0, 1, 0, -1) var totalMax = 0 fun main() = with(BufferedReader(InputStreamReader(System.`in`))) { val (row, col) = readLine().split(" ").map { it.toInt() } graph = Array(row + 1) { CharArray(col + 1) } visited = Array(row + 1) { BooleanArray(col + 1) { false } } repeat(row) { readLine().forEachIndexed { index, c -> graph[it + 1][index + 1] = c } } for (i in 1..row) { for(j in 1..col) { if (graph[i][j] == 'L') { totalMax = max(totalMax, bfs(i, j, row, col)) } } } println(totalMax) } fun bfs(x: Int, y: Int, row: Int, col: Int): Int { visited = Array(row + 1) { BooleanArray(col + 1) { false } } val queue: Queue<Triple<Int, Int, Int>> = LinkedList() var max = 0 queue.offer(Triple(x, y, 0)) visited[x][y] = true while (queue.isNotEmpty()) { val q = queue.poll() max = q.third for (i in 0 until 4) { val moveX = q.first + dx[i] val moveY = q.second + dy[i] if (moveX > row || moveY > col) continue if (visited[moveX][moveY]) continue if (graph[moveX][moveY] != 'L') continue queue.offer(Triple(moveX, moveY, q.third + 1)) visited[moveX][moveY] = true } } return max }
'개발 > 알고리즘' 카테고리의 다른 글
[백준] 1193 분수찾기 Kotlin (0) 2023.04.28 [백준] 5568 카드 놓기 Kotlin (0) 2023.04.27 [백준] 14496 그대, 그머가 되어 Kotlin (0) 2023.01.23 [백준] 21937 작업 Kotlin (0) 2023.01.21 [백준] 1058 친구 Kotlin (0) 2023.01.20