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가 문자열 중간에 여러 번 나오는 것은 감지 못하는 것 같았다.