Programmers Greedy 2級ゲームレバー


def solution(name):
    answer = 0
    namelen = len(name)
    move = [0] * namelen
    origin = "A" * namelen
    AZ = 26
    for idx in range(namelen):
        gap = ord(name[idx]) - ord(origin[idx])
        if(gap > 13):
            gap = AZ - gap
        move[idx] = gap
    print(move)
    idx = 0
    while True:
        answer += move[idx]
        move[idx] = 0
        if(sum(move)==0):
            break
        left, right = 1, 1
        while(move[idx-left]==0):
            left+=1
        while(move[idx+right]==0):
            right+=1
        answer += left if left < right else right
        idx += -left if left < right else right
    return answer
一番外のwhileドアはこの問題の核心のようだ.
アルファベットを上下に変換するのは比較的簡単ですが、カーソルが左右に移動するときの最小値を見つけます.
左右移動では,最もコストの低い方向へ移動するのがこのコードであり,Greedyの方法論にも合致する.
    idx = 1
    cnt = 0
    idx2 = 1
    cnt2 = 0
    while(name[idx] =='A'):
        cnt += 1 
        idx += 1
    while(name[-idx2] =='A'):
        cnt2 += 1 
        idx2 += 1
    answer += namelen-1-max(cnt,cnt2)
Aが連続して出てくる部分を避ければいいと思っていたのですが、Aが文字列の間に何度も出てくるのに気づかなかったようです.