소스 코드

# dict형태를 2개 만들어서 'A' : 1, 1 : 'A' 형태로 만들어 두기
# 글자 바꿀 때 사용
alpha = dict()

i = 65
for q in range(1,27):
    alpha[chr(i)] = q
    i += 1

r_alpha = dict()

i = 65
for q in range(1,27):
    r_alpha[q] = chr(i)
    i += 1

def solution(name):
    n = len(name)

    # 글자, idx, cnt
    temp = [['A'*n,0,0]]

    while True:
        word, idx, cnt = temp.pop(0)

        if name[idx] != word[idx]:

            word = word[:idx] + name[idx] + word[idx+1:]

            # 알파벳 이동 순서 결정
            if 26 - alpha[word[idx]] + 1 > alpha[word[idx]] - 1:
                cnt += alpha[word[idx]] - 1

            else:
                cnt += 26 - alpha[word[idx]] + 1

        # 탈출조건
        # 현재까지 이동한 값이 목표 값(name)과 같은지 확인
        if word != name:
            
            # 오른쪽 이동
            temp.append([word,(idx+1)%n,cnt+1])
            
            # 왼쪽 이동
            # 왼쪽 이동의 경우 0 - 1의 경우 존재하기 때문에 2가지 경우로 나눠서 확인
            if idx == 0:
                temp.append([word,n-1,cnt+1])
            else:
                temp.append([word,idx-1,cnt+1])
        else:
            break

    answer = cnt
    return answer

 


해결 방법

1. bfs를 사용

 

2. 알파벳은 한 방향으로만 이동

ex) C를 만들기 위해서는 A -> B -> C(2칸 이동)의 방법과 A -> Z -> ... D -> C 의 방법이 있음

이 두 방법 중 최소의 것을 선택

 

3. 커서의 이동은 방향을 바꿔야할 경우가 존재

ex) BBAAAB의 경우 오른쪽 한 방향으로 이동하면 8번의 행동이 필요하지만

A 전까지 오른쪽 이동 후 왼쪽으로 이동하면 6번의 행동이 필요


느낀 점

 

 

ps. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.

 

오류적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.

 

혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.