[9019] DSLR

toru·2022년 9월 15일
0
 문자열로 쉽게 풀릴거 같은 예감.
 익숙한 입질...이건...도망쳐!

 R에서 n/1000이 아니라는 걸 몰랐다면 못 풀었겠지.
 DSLR 변수를 따로 만들지 말고 하나의 배열의 저장하면 더욱 빠르다.
// 1928ms
for _ in 0..<Int(readLine()!)! {
    let p = readLine()!.split(separator: " ").map {Int(String($0))!}
    let (a,b) = (p[0],p[1])
    var visited = [Bool](repeating: false, count: 10000)
    var q = [(a,0)]
    var index = 0
    
loop: while true {
    let n = q[index].0
    let cmd = q[index].1
    index += 1
    
     let next = [
        0,
        n*2%10000,
        n==0 ? 9999 : n-1,
        n*10%10000+n/1000,
        n%10*1000+n/10
    ]
    for i in 1...4 {
        if next[i] == b {
            var result = ""
            for i in String(cmd*10+i) {
                switch i {
                case "1" : result += "D"
                case "2" : result += "S"
                case "3" : result += "L"
                default: result += "R"
                }
            }
            print(result)
            break loop
        }
        
        if !visited[next[i]] {
            visited[next[i]] = true
            q.append((next[i], cmd*10 + i))
        }
    }
}}
// 4960ms
let t = Int(readLine()!)!
let mod = 10000

for _ in 0..<t {
    let p = readLine()!.split(separator: " ").map{Int(String($0))!}
    let (a,b) = (p[0],p[1])
    var visited = [Bool](repeating: false, count: 10000)
    var q = [(a,"")]
    var index = 0
    
    while index < q.count {
        let n = q[index].0
        let cmd = q[index].1
        index += 1
        
        if n == b { 
        	print(cmd) 
            break
        }        
        let d = n*2 % mod
        let s = n==0 ? 9999 : n-1
        let l = n%1000*10 + n/1000
        let r = n%10*1000 + n/10
        
        if !visited[d] {
            visited[d] = true
            q.append((d, cmd+"D"))
        }
        if !visited[s] {
            visited[s] = true
            q.append((s, cmd+"S"))
        }
        if !visited[l] {
            visited[l] = true
            q.append((l, cmd+"L"))
        }
        if !visited[r] {
            visited[r] = true
            q.append((r, cmd+"R"))
        }
    }
}
//  함수로 빼면 시간초과
// func check(_ num:Int,_ cmd:String,_ new:String) {
//     if !visited[num] {
//         visited[num] = true
//         q.append((num, cmd + new))
//     }
// }

Referrences

질문창에 cdg0228님
URL에 비공개 단어가 포함되어 있다.

profile
iOS

0개의 댓글