Programmers Greedy 2級ゲームレバー
1199 ワード
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が文字列の間に何度も出てくるのに気づかなかったようです.Reference
この問題について(Programmers Greedy 2級ゲームレバー), 我々は、より多くの情報をここで見つけました https://velog.io/@hylee5642/Programmers-Greedy-조이스틱テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol