본문 바로가기

개발/알고리즘

[백준] BFS - 1697번 숨바꼭질

반응형
 

1697번: 숨바꼭질

수빈이는 동생과 숨바꼭질을 하고 있다. 수빈이는 현재 점 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의 위치로 이동하게 된다.
수빈이가 동생을 찾을 수 있는 가장 빠른 시간이 몇 초 후인지 구하는 프로그램을 작성하시오.

풀이

트리 형식으로 생각했다. 수빈이의 위치 값을 저장하고 해당 위치에 2배를 곱한 값, +1 값, -1 값 을 구한다.
구한 값을 기준으로 반복해가며 동생 위치에 도달하는 빠른 시간을 찾는다.
탐색한 곳을 재탐색하지 않기 위해 visited를 달았다. 안전한 탐색을 위해 조건문을 달아주자.

Swift 전체 코드

let num = readLine()!.split(separator: " ").map { Int($0)! }
var array : [Int] = [num.first!]
var visited : [Bool] = .init(repeating: false, count:100_001)
var temp : [Int] = []
var count = 0

while num.first! != num.last! {
    let value = array.removeLast()
    
    let mul = value * 2
    let add = value + 1
    let sub = value - 1
    
    if [mul, add, sub].contains(num.last) {
        count += 1
        break
    }
    
    if value < 100_001 && visited[value] == false {
        visited[value] = true
    }
    if sub >= 0 && sub < 100_001 && visited[sub] == false {
        temp.append(sub)
        visited[sub] = true
    }
    if value < num.last!  {
        if add < 100_001 && visited[add] == false {
            temp.append(add)
            visited[add] = true
        }
        if mul < 100_001 && visited[mul] == false {
            temp.append(mul)
            visited[mul] = true
        }
    }
    
    if array.isEmpty {
        array.append(contentsOf: temp)
        temp = []
        count += 1
    }
}

print(count)
반응형

'개발 > 알고리즘' 카테고리의 다른 글

[백준] 2581번 소수  (0) 2021.10.05
[백준] BFS - 7576번 토마토  (0) 2021.10.01
[백준] BFS - 2178번 미로탐색  (0) 2021.09.28
[백준] BFS - 1926번 그림  (0) 2021.08.30
[백준] 그리디 - 1931번 회의실 배정  (0) 2021.04.29