https://www.acmicpc.net/problem/2589
2589번: 보물섬
보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서
www.acmicpc.net
난이도 : 골드 5
태그 : 그래프 이론, 브루트포스 알고리즘, 그래프 탐색, 너비 우선 탐색
1. 설명
같은 육지 내에서 최단 경로로 이동했을 때, 거리가 가장 긴 경로를 찾는 문제입니다.
BFS를 응용하여 풀 수 있을 것 같은데요.
그럼, 같은 육지 내 겨올가 최대가 되는 경우는 어떻게 찾을 수 있을까요?
단순히 육지의 모든 점에서 BFS를 수행하면 됩니다.
가로, 세로의 크기가 최대 50밖에 되지 않기 때문에 충분히 시간 안에 통과가 가능합니다.
2. 소스코드
<kotlin />
import java.util.LinkedList
import java.util.Queue
fun main() = with(System.`in`.bufferedReader()) {
val (n, m) = readLine().split(" ").map { it.toInt() }
val map = Array(n) { readLine().toCharArray() }
val dx = arrayOf(0, 0, 1, -1)
val dy = arrayOf(1, -1, 0, 0)
var max = 0
repeat(n) { x ->
repeat(m) { y ->
if (map[x][y] == 'W') return@repeat
val visited = Array(n) { IntArray(m) { 0 } }
val queue = LinkedList<Pair<Int, Int>>() as Queue<Pair<Int, Int>>
queue.add(Pair(x, y))
visited[x][y] = 1
while (queue.isNotEmpty()) {
val target = queue.poll()
for (i in 0 until 4) {
val nx = target.first + dx[i]
val ny = target.second + dy[i]
if (nx !in 0 until n || ny !in 0 until m || visited[nx][ny] != 0 || map[nx][ny] == 'W') continue
queue.add(Pair(nx, ny))
visited[nx][ny] = visited[target.first][target.second] + 1
if (visited[nx][ny] > max) max = visited[nx][ny]
}
}
}
}
println(max - 1)
}
육지의 모든 점에서 BFS 탐색을 새롭게 수행하되,
매번 경로의 최댓값을 갱신하는 방식으로 진행되고,
최종적으로 최댓값을 출력합니다.
3. 후기
처음에 BFS에 다이나믹 프로그래밍을 섞어 풀어야 하나 싶긴 했지만,
범위를 보고 안심하며 브루트포스 + BFS로 풀었습니다.
그래프는 항상 재밌네요.
'코딩테스트 > Kotlin' 카테고리의 다른 글
[백준 2309번] [Kotlin] 일곱 난쟁이 (0) | 2023.06.18 |
---|---|
[백준 1547번] [Kotlin] 공 (0) | 2023.06.18 |
[백준 18110번] [Kotlin] solved.ac (0) | 2023.06.14 |
[백준 2696번] [Kotlin] 중앙값 구하기 (0) | 2023.06.13 |
[백준 2610번] [Kotlin] 회의준비 (0) | 2023.06.12 |