Developing Myself Everyday
 

12851번: 숨바꼭질 2

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때

www.acmicpc.net

문제

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 N(0 ≤ N ≤ 100,000)에 있고, 동생은 점 K(0 ≤ K ≤ 100,000)에 있다. 수빈이는 걷거나 순간이동을 할 수 있다. 만약, 수빈이의 위치가 X일 때 걷는다면 1초 후에 X-1 또는 X+1로 이동하게 된다. 순간이동을 하는 경우에는 1초 후에 2*X의 위치로 이동하게 된다.

수빈이와 동생의 위치가 주어졌을 때, 수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 그리고, 가장 빠른 시간으로 찾는 방법이 몇 가지 인지 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에 수빈이가 있는 위치 N과 동생이 있는 위치 K가 주어진다. N과 K는 정수이다.

출력

첫째 줄에 수빈이가 동생을 찾는 가장 빠른 시간을 출력한다.

둘째 줄에는 가장 빠른 시간으로 수빈이가 동생을 찾는 방법의 수를 출력한다.

 

나의 풀이

 이 문제는 BFS를 이용해서 해결해야 하는 문제이다. 동생을 찾는 가장 빠른 시간을 출력하는 부분은 BFS로 간단하게 구현 할 수 있다. 다만 동생을 찾는 방법의 수를 찾아야 하는데 문제이다. 그래서 나는 minTime이라는 변수를 따로 둬서 처음 동생을 찾았을 때 minTime을 기록하게 했다. 그리고 원래는 visited를 다음에 방문할 숫자에 체크했었는데 이번에는 방문한 숫자에 체크하는 식으로 바꿔서 진행하고 방문할 숫자가 동생이 있는 숫자인지 체크하는 식으로 문제를 해결하였다.

import java.util.LinkedList
import java.util.Queue
import kotlin.math.min

fun main() = with(System.`in`.bufferedReader()) {
    val (n, k) = readLine().split(" ").map { it.toInt() }

    bfs(n, k)
}


fun bfs(n: Int, k: Int) {
    val visited = BooleanArray(200001)
    var minTime = 0
    var cnt = 1

    val queue: Queue<Pair<Int, Int>> = LinkedList()
    queue.add(n to 0)
    visited[n] = true

    while (queue.isNotEmpty()) {
        val (now, time) = queue.poll()
        visited[now] = true

        if (now == k && minTime != 0 && minTime == time) {
            cnt++
        }

        if (now == k && minTime == 0) {
            minTime = time
        }

        for (move in arrayOf(now + 1, now - 1, now * 2)) {
            if (move in 0 until 200000 && !visited[move]) {
                queue.offer(move to time + 1)
            }
        }
    }

    println(minTime)
    println(cnt)
}
profile

Developing Myself Everyday

@배준형

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!