소스 코드
# 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. 개인적인 코드와 코드를 작성의 이유를 적은 것입니다.
오류나 적절치 않은 문법이 존재할 수 있으며, 다른 분들께는 굉장히 비효율적인 방법으로 여겨질 수 있습니다.
혹시 개선 사항, 오류 및 문제에 대한 수정 사항 등을 댓글로 남겨주신다면 감사한 마음으로 배우고 수정하겠습니다.
'코딩 문제해결 > 문제풀이.프로그래머스' 카테고리의 다른 글
[프로그래머스 코딩] 실패율 - PYTHON (0) | 2021.09.05 |
---|---|
[프로그래머스 코딩] 프린터 - PYTHON (0) | 2021.09.04 |
[프로그래머스 코딩] 전화번호 목록 - PYTHON (0) | 2021.09.02 |
[프로그래머스 코딩] 124 나라의 숫자 - PYTHON (0) | 2021.09.01 |
[프로그래머스 코딩] 스킬트리 - PYTHON (0) | 2021.08.31 |