경험의 기록

문제 : https://www.acmicpc.net/problem/1697

 

1697번: 숨바꼭질

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

www.acmicpc.net

 

 

import java.util.*
import kotlin.collections.HashSet


var n = 0
var k = 0
var count = 0
lateinit var queue : Queue<Int>
lateinit var visit : HashSet<Int>

fun main() = with(Scanner(System.`in`)){
    n = nextInt()
    k = nextInt()
    queue = LinkedList()
    visit = HashSet()

    if(n>=k){
        return println(n-k)
    }
    find(n)
}

fun find(n : Int){
    var tmp = n
    queue.add(tmp)

    while(queue.isNotEmpty()){
        for(i in 1..queue.size){
            tmp = queue.poll()

            if(tmp == k) return println(count)

            for(j in 0..2){
                when(j){
                    0 -> {
                        if(tmp*2 > 100000 || visit.contains(tmp*2)) continue
                        queue.add(tmp*2)
                        visit.add(tmp*2)
                    }
                    1 -> {
                        if(tmp+1 > 100000|| visit.contains(tmp+1)) continue
                        queue.add(tmp+1)
                        visit.add(tmp+1)
                    }
                    2 -> {
                        if(tmp-1 < 0|| visit.contains(tmp-1)) continue
                        queue.add(tmp-1)
                        visit.add(tmp-1)
                    }
                }
            }
        }
        count++
    }
}

 

bfs로 계산하여

이미 나왔었던 수는 다시해도 무한히 반복이므로

방문처리해주어 예외처리하면서 레벨을 체크했다.

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band
loading