JOY STIC(Lv.2)


質問リンク

に答える

import Foundation

func solution(_ name:String) -> Int {
    var result = 0
    var nameArr = name.map { Int(UnicodeScalar(String($0))!.value) - 65 } // A = 0, B = 1 이런식으로 값으로 변환
    
    // 전부 A일 경우의 예외처리
    var isAllA = true
    for name in nameArr {
        if name != 0 {
            isAllA = false
            break
        } 
    }
    
    if isAllA {
        return 0
    }
    
    // 조이스틱 왼/오른쪽의 경우에 소요되는 값만 계산
    var greedyVal = nameArr.count - 1   // 어느 식으로 돌아야 최선일지 찾는다.
    
    // 먼저 뒤로갔다 앞으로 갈 경우 체크
    for index in stride(from: nameArr.count - 1, to: 1, by: -1) {        
        if nameArr[index] == 0   // 지금 순번이 A인 경우이거나
        || nameArr[index - 1] != 0 {    // 다음게 A가 아닐경우 체크할 필요 없다.
            continue    
        } 
        
        // 거꾸로 갔을 때 몇번째까지 가야하는지 체크
        var moveMore = 0
        for i in 1..<index {
            if nameArr[i] == 0 {
                continue
            } else {
                moveMore = i
            }
        }
        
        var backMove = ((nameArr.count - index) * 2)
        if moveMore == 0 {  // 앞으로 다시갈 일이 없다면
            backMove = nameArr.count - index
        }
        
        let moveVal = backMove + moveMore
        if greedyVal > moveVal {
            greedyVal = moveVal
        }
    }
    
    // 먼저 앞으로 갔다 뒤로 갈 경우 체크
    for index in 0..<nameArr.count - 1 {
        if nameArr[index] == 0   // 지금 순번이 A인 경우이거나
        || nameArr[index + 1] != 0 {    // 다음게 A가 아닐경우 체크할 필요 없다.
            continue    
        } 
        
        var moveMore = 0
        for i in stride(from: nameArr.count - 1, to: index + 1, by: -1) {
            if nameArr[i] == 0 {
                continue
            } else {
                moveMore = nameArr.count - i
            }
        }
        
        var backMove = index * 2
        if moveMore == 0 {  // 뒤로 다시갈 일이 없다면
            backMove = index
        }
        
        let moveVal = backMove + moveMore
        if greedyVal > moveVal {
            greedyVal = moveVal
        }
    }
    //print(greedyVal)
    result = greedyVal
    
    // 조이스틱 위 아래의 경우에 소요되는 값만 계산
    for (index, name) in nameArr.enumerated() {
        if name > 12 {  // 조이스틱 아래쪽으로 이동하는게 빠른 경우
            result += 26 - name
        } else {    // 조이스틱 위쪽으로 이동하는게 빠른 경우
            result += name
        }
    }

    return result
}

ポスト


アスキーコードで変更して比較する部分は何もありませんが...
肝心な問題は、レバーの左から右への移動を最小限に抑える方法を見つけることです.
最初はJOYSTICが前を向いて後ろを向いていることだけを考えていたのですが、解けていないことに気づきました
反対の場合もコードでコードを記述するため、コード量がかなり多くなります.
徹底的に探索しただけであれば、コードはもっと簡潔になるはずです.