본문 바로가기
알고리즘 문제풀이

[백준 13549] 숨바꼭질 3 (Swift)

by SiO2whocode 2025. 4. 7.

https://www.acmicpc.net/problem/13549

 

BFS

점 N에서 K까지 이동하는데, -1,+1, *2 로 이동할 수 있다고 할 때 K까지 가장 빠르게 도착할 수 있는 시간 출력하기

 

접근방법

이 문제는 숨바꼭질 2랑 아주 비슷한 문제다.

차이점은 -1,+1만큼 이동할 때는 1초가 걸리지만 *2 만큼 이동할 때는 순간이동이라 0초가 걸린다는 것

그리고 가장 빨리 도착한 시간과 경우의 수를 출력하는 게아니라 가장 빨리 도착한 시간만 출력해주면 된다는 거

그래서 숨바꼭질 2 코드에서 *2 하는 경우에서 nowdist+1을 대입하는게 아니라 nowdist를 그대로 대입해주었고,

경우의 수를 계산하는 코드를 지워서 제출했다.

 

뭔가 숨바꼭질4는 경우의 수 세라는 문제일 것 같긴한데

 

소스코드

 

import Foundation

func solution() {
    let input:[Int] = (readLine()?.split(separator: " ").map { Int($0)! })!
    let n:Int = input[0]
    let k:Int = input[1]
    
    var dist:[Int] = [Int](repeating: Int.max, count: 100001)
    var cnt:[Int] = [Int](repeating: 0, count: 100001)
    
    dist[n] = 0
    cnt[n] = 1
    
    var q:[Int] = []
    q.append(n)
    
    while !q.isEmpty {
        let now = q.removeFirst()
        let nowdist = dist[now]
        
        if now-1 >= 0 && now-1 <= 100000 {
            if dist[now-1] > nowdist+1 {
                // 처음방문
                dist[now-1] = nowdist+1
                cnt[now-1] = cnt[now]
                q.append(now-1)
            } 
        }
        if now+1 <= 100000 && now+1 >= 0 {
            if dist[now+1] > nowdist+1 {
                // 처음방문
                dist[now+1] = nowdist+1
                cnt[now+1] = cnt[now]
                q.append(now+1)
            }
        }
        if now*2 <= 100000 && now*2 >= 0 {
            if dist[now*2] > nowdist {
                // 처음방문
                dist[now*2] = nowdist
                cnt[now*2] = cnt[now]
                q.append(now*2)
            }
        }
    }
    
    print(dist[k])
}

solution()
728x90

'알고리즘 문제풀이' 카테고리의 다른 글

[백준 2933] 미네랄 (Swift)  (0) 2025.04.09
[백준 5557] 1학년 (Swift)  (0) 2025.04.08
[백준 11559] puyo puyo (Swift)  (0) 2025.04.03
[백준 1949] 우수 마을 (Swift)  (0) 2025.04.02
[백준 12851] 숨바꼭질 2 (Swift)  (0) 2025.03.31