1697번: 숨바꼭질백준/문제2023. 8. 15. 14:36
Table of Contents
문제 출처 : https://www.acmicpc.net/problem/1697
언어 : Kotlin
문제 설명 :
수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.
수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.
- 첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.
- 수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.
- 수빈이가 5-10-9-18-17 순으로 가면 4초만에 동생을 찾을 수 있다.
제한 사항 :
- 시간 제한 : 2초
- 메모리 제한 : 128MB
입출력 예 :
입력 | 출력 |
5 17 | 4 |
풀이 :
import java.io.BufferedReader
import java.io.BufferedWriter
import java.io.InputStreamReader
import java.io.OutputStreamWriter
fun main() {
val br = BufferedReader(InputStreamReader(System.`in`))
val bw = BufferedWriter(OutputStreamWriter(System.out))
val (n, k) = br.readLine().split(" ").map { it.toInt() }
val tree = IntArray(100001)
bfs(n, k, tree)
bw.write("${tree[k]}")
bw.flush()
bw.close()
}
fun bfs(n: Int, k: Int, tree: IntArray) {
var node = n
val queue = ArrayDeque<Int>()
queue.add(node)
while (queue.isNotEmpty()) {
node = queue.removeFirst()
if (node == k) break
if (node - 1 >= 0 && tree[node - 1] == 0) {
queue.add(node - 1)
tree[node - 1] = tree[node] + 1
}
if (node + 1 <= 100000 && tree[node + 1] == 0) {
queue.add(node + 1)
tree[node + 1] = tree[node] + 1
}
if (node * 2 <= 100000 && tree[node * 2] == 0) {
queue.add(node * 2)
tree[node * 2] = tree[node] + 1
}
}
}
'백준 > 문제' 카테고리의 다른 글
14940번: 쉬운 최단거리 (0) | 2023.08.16 |
---|---|
1931번: 회의실 배정 (0) | 2023.08.16 |
11724번: 연결 요소의 개수 (0) | 2023.08.15 |
2630번: 색종이 만들기 (0) | 2023.08.14 |
1927번: 최소 힙 (0) | 2023.08.14 |
@스몰스테핑 :: 작은 발걸음
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!