728x90
https://www.acmicpc.net/problem/13913
13913번: 숨바꼭질 4
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일
www.acmicpc.net
문제 풀이
1. https://www.acmicpc.net/problem/1697 와 동일하게 BFS 를 이용하여 푼다.
2. 출력에서 최단 시간의 지난 경로를 출력해야 한다.
3. 경로를 출력하기 위해서 방문 배열(visit) 를 이용한다.
4. 이때 방문 배열을 기존과 같은 BooleanArray 가 아닌 IntArray 로 선언한다.
5. visit 배열에 visit[next] = currentPosition 으로 저장을 한다.
6. 최단 시간이 되었을 때 visiti 배열을 K -> N 으로 역으로 탐색하여 결과를 출력한다.
7. 마지막으로 방문배열은 -1 로 초기화 하여 선언한다. N, K 가 0도 될 수 있기 때문에 0 으로 초기화하게 되면 메모리 초과 에러가 발생한다.
코드
import java.io.*
import java.util.*
fun main(args: Array<String>) {
val br = BufferedReader(InputStreamReader(System.`in`))
val (N, K) = br.readLine().split(" ").map { it.toInt() }
bfs(N, K)
}
private fun bfs(N: Int, K: Int) {
val queue = LinkedList<Pair<Int, Int>>()
val visit = IntArray(100001) { -1 }
queue.add(Pair(N, 0))
while (queue.isNotEmpty()) {
val (curPosition, curTime) = queue.pop()
if (curPosition == K) {
println(curTime)
val result = mutableListOf<Int>()
var nextK = K
result.add(nextK)
if (nextK != N) {
while (true) {
//println("$nextK, ${visit[nextK]}")
result.add(visit[nextK])
nextK = visit[nextK]
if (nextK == N) break
}
}
val sb = StringBuilder()
for (i in result.size - 1 downTo 0 step 1) {
sb.append("${result[i]} ")
}
println(sb.toString())
return
}
for (i in 0..2) {
val nextPosition = when (i) {
0 -> curPosition - 1
1 -> curPosition + 1
else -> curPosition * 2
}
if (nextPosition < 0 || nextPosition > 100000) continue
if (visit[nextPosition] != -1) continue
//println("curPosition : $curPosition, nextPosition : $nextPosition")
visit[nextPosition] = curPosition
queue.add(Pair(nextPosition, curTime + 1))
}
}
}
728x90
'알고리즘(w.KOTLIN) > 그래프(bfs, dfs, 다익스트라)' 카테고리의 다른 글
[백준][코틀린][14226] 이모티콘 (0) | 2023.02.20 |
---|---|
[백준][코틀린][13549] 숨바꼭질3 (0) | 2023.02.20 |
[백준][코틀린][1697] 숨바꼭질 (0) | 2023.02.20 |
[백준][코틀린][1697] 숨바꼭질 (0) | 2023.02.17 |
[백준][코틀린][2146] 다리 만들기 (0) | 2023.02.17 |