[백준] 숨바꼭질 3 (13549)(kotlin)
문제 설명
입력 및 출력
» 입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
» 출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
예제 입출력(테스트케이스)
입력 | 출력 |
---|---|
5 17 | 2 |
문제 힌트
수빈이가 5-10-9-18-17 순으로 가면 2초만에 동생을 찾을 수 있다.
문제 풀이1
import java.util.*
import kotlin.math.max
import kotlin.math.min
var arr = intArrayOf()
var max = 0
class Point(val x: Int, val count: Int)
fun main() = with(System.`in`.bufferedReader()) {
val (N, K) = readLine().split(" ").map { it.toInt() }
max = max(N, K) * 2 + 1
arr = IntArray(max) { Int.MAX_VALUE }
ß
bfs(N, K)
println(arr[K])
}
fun bfs(start: Int, dest: Int) {
val q = LinkedList<Point>()
q.add(Point(start, 0))
while (q.isNotEmpty()) {
val now = q.poll()
arr[now.x] = min(arr[now.x], now.count)
if (now.x == dest) break
if (now.x * 2 <= dest + 1 && arr[now.x * 2] == Int.MAX_VALUE) {
q.add(Point(now.x * 2, now.count))
}
if (now.x + 1 < max && arr[now.x + 1] == Int.MAX_VALUE) {
q.add(Point(now.x + 1, now.count + 1))
}
if (now.x - 1 >= 0 && arr[now.x - 1] == Int.MAX_VALUE) {
q.add(Point(now.x - 1, now.count + 1))
}
}
}