문제
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 0초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
입력
첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
출력
수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
풀이
deque를 이용해서 워프하는 경우를 deque에 앞에 넣고 그 외의 시간이 결려서 이동하는것은 뒤로 넣어서 가중치 차이를 구분하여 구했다.
코드
import java.util.Deque
import java.util.LinkedList
fun main()
{
val input = readLine()!!.split(" ").map{it.toInt()}
val N = input[0]
val K = input[1]
val MAX = 100001
val visited = IntArray(MAX,{MAX})
visited[N] = 0
val dq : Deque<Int> = LinkedList()
dq.addFirst(N)
while(dq.isNotEmpty())
{
val pd = dq.removeFirst()
if(pd == K) {
println(visited[pd])
return
}
if(pd * 2 < MAX && visited[pd*2] == MAX){
dq.addFirst(pd*2)
visited[pd*2] = visited[pd]
}
if (pd+1 < MAX && visited[pd+1] == MAX){
dq.addLast(pd+1)
visited[pd+1] = visited[pd] + 1
}
if (pd-1 >= 0 && visited[pd-1] == MAX){
dq.addLast(pd-1)
visited[pd-1] = visited[pd] + 1
}
}
}
'백준 > 기타' 카테고리의 다른 글
백준 [12919] kotlin (0) | 2023.01.08 |
---|---|
백준 14719 [kotlin] (0) | 2022.07.06 |
백준 1038 [kotlin] (0) | 2022.07.06 |
백준 2023 [kotlin] (0) | 2022.07.04 |
백준 1920 [kotlin] (0) | 2022.06.23 |