Programmers Greedy 2단계 조이스틱

이호영·2021년 7월 1일
0
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가 문자열 중간에 여러 번 나오는 것은 감지 못하는 것 같았다.

profile
Speech Synthesis & Voice Cloning

0개의 댓글