木の棒


🔒 質問する



😅 ミス


Aが出てくる回数にかかわらず、一方向にチェックすればいいと思います.
「BBAAAAAC」の場合、ステアリング(左->右または左<-右)の移動回数がより短い.

💡 構想




CASEで分けましょう
[CASE 1]Aが存在しないか1つ
一つの方向に移動すればいいです.(名前の長さ-1)
※ただし、2番目の位置または最後の位置にAが現れると、1回の移動がより節約されます.
2位A->左、最後のA->右
[CASE 2]Aが連続して現れる場合
(韓国側ハンドルボックス)、(左->右)、(左<-右)方向転換ハンドルボックスの3つのうち最小値をとる.方向転換起点は連続するAシーケンスである

🔑プール(Kotlin)

class Solution {
    fun solution(name: String): Int {
        // Up, Down 기준은 반올림 기준 알파뱃 14번째 'N'
        // 'A' -> 'N' == 13, 'N' <- 'A' == 13 (왼, 오른방향 모두 13회)
        val getUpDownCount : (Char) -> (Int) = { nameAlphabet: Char ->
            if (nameAlphabet <= 'N') nameAlphabet - 'A'
            else 13 - ((nameAlphabet - 'A') % 13)
        }
        if (!name.contains("AA")){
            // 2번째 자리 || 마지막자리 A
            return if (name.last() == 'A' || name[1]?.let{it == 'A'}) name.fold(0){ sum, alphabet -> sum + getUpDownCount(alphabet)} + name.length - 1 - 1 // 마지막 자리 이동 X || 좌방향 검사로 해결
            // 아니면 길이 - 1 (One way move)
            else name.fold(0){ sum, alphabet -> sum + getUpDownCount(alphabet)} + name.length - 1 // -1 : 첫자리는 이동 X
        } else {
             // considering shift of direction (좌->우, 좌<-우)
            // 방향전환의 기점은 가장 긴 A 연속 지점 이전, 이후
            val numberOfA = ArrayList<Int>()
            val startIndex = name.indexOf("AA")
            var index = startIndex // 첫 AA 시퀀스 등장 index 로 초기화
            var count: Int = 0
            // A sequence keep in ArrayList
            while (index < name.length) {
                if(name[index] != 'A') {
                    index++
                    continue
                } else {
                    while(name[index++] == 'A') count++
                    numberOfA.add(count)
                    count = 0
                }
            }
            val sequenceA = "A".repeat(Collections.max(numberOfA)) // 가장 긴 A 시퀀스를 얻어냄.
            val shiftRightToLeft = (name.substringBefore(sequenceA).length - 1) * 2 + name.substringAfterLast(sequenceA).length
            val shiftLeftToRight = name.substringBefore(sequenceA).length + (name.substringAfterLast(sequenceA).length * 2 - 1)
            /* answer 1 :  one-way solution with reaching 'A'(case2) */
            val answer1 = name.fold(0){sum, alphabet -> sum + getUpDownCount(alphabet)} + name.length - 1
            // answer 2 : MIN_VALUE of shift direction (좌->우 or 좌<-우)
            var answer2 = Integer.min(shiftRightToLeft, shiftLeftToRight)
            for (alphabet in name) answer2 += getUpDownCount(alphabet)
            return Integer.min(answer1, answer2)
        }
    }
}