def solution(name):
answer = 0
move = len(name) - 1
# 1
for n in name :
answer += min(ord('Z') - ord(n) + 1, ord(n)-ord('A'))
# 2
if 'A' in name :
# 3
for i, n in enumerate(name) :
idx = i + 1
while idx < len(name) and name[idx] == 'A' :
idx += 1
move = min(move, i * 2 + len(name) - idx, i + (len(name) - idx) * 2)
# 4
return answer + move
답을 도출하는 순서는 다음과 같다.
- 먼저 모든 문자의 아스키 코드를 이용해 다음 알파벳으로 이동하는 횟수 구하기
1.1. 'A' 부터 시작했을 때, 아니면 뒤로 돌아가서 'Z'에서 시작했을 때 이동 횟수를 각각 구하고 그 중 작은 수를 answer에 더한다.- name에 'A'가 없다면 처음부터 오른쪽 방향으로 쭉 가면 되므로 len(name) - 1 더하고 출력하기(끝)
- name에 'A'가 있을 경우, 한 문자씩 보기
3.1. 바로 다음 문자가 'A'일 경우 연속되는 'A'의 끝을 구하고, 구한 끝을 이용해서 오른쪽으로 갈지, 왼쪽으로 갈지 구하기- 움직임(move) 값과 answer값을 더해서 출력하기 (끝)
여기서 3번을 만드는 부분이 어려웠기 때문에 결국 다른 분의 풀이 방법을 참고해서 풀었다.
name에 'A'가 없으면 그냥 시작부터 오른쪽으로 쭉 가면 된다.
'A'가 없을 경우, 이동하는 방법은 3가지다.
시작부터 오른쪽으로 쭉 가기.(len(name) - 1)
시작에서 'A'까지 오른쪽으로 갔다가 다시 돌아와서 왼쪽으로 가기
시작에서 왼쪽으로 'A'까지 갔다가 다시 돌아와서 오른쪽으로 가기
이 세 가지 방법을 모두 구하고, 그 중에서 가장 작은 값을 더해주면 된다.
자바스크립트도 위와 같은 방법으로 코드를 작성할 수 있었다.
function solution(name) {
let answer = 0;
let move = name.length - 1;
for (let i = 0; i < name.length; i++) {
answer += Math.min(name[i].charCodeAt(0) - 'A'.charCodeAt(0), 'Z'.charCodeAt(0) - name[i].charCodeAt(0) + 1);
let idx = i + 1;
while (idx < name.length && name[idx] === 'A') {
idx++;
}
move = Math.min(move, i*2 + name.length - idx, i + (name.length - idx) * 2)
}
return answer + move;
}