난 조이스틱을 모른다. 그래서 문제 자체를 이해하기 어려웠다.
이전, 다음 알파벳으로 이동은 직관적으로 이해된다.
커서를 왼쪽, 오른쪽으로 이동한다는 의미는?
테스트 1번 문제로 예를 들면,
오른쪽으로만 이동한다면
AAAAAA
-12345
총 다섯번 움직인다.
두 번째 문자에서 뒤로 돌아간다면
AAAAAA
216543
총 여섯번 움직인다.
뒤로 가는 경우는?
BBAAB
-1234
보다
BBAAB
21--3
이 더 적게 이동한다.
function solution(name) {
// 알파벳 조작 횟수
let sum = 0;
for (let i = 0; i < name.length; i++) {
let diff = name[i].charCodeAt() - 'A'.charCodeAt();
sum += diff > 13 ? 26 - diff : diff;
}
// 문자로 이동한 횟수
let minMove = name.length - 1; // 오른쪽으로만 마지막 문자까지 이동한 경우
for (let i = 0; i < name.length; i++) {
// 만들어야 하는 name에 A가 포함된 경우
// A에는 커서를 이동하지 않아도 된다
// 즉, 이동 수가 줄 수도 있다
if (name[i] === 'A') {
let j = i + 1;
// i 다음 'A'가 아닌 문자 위치는 j
while (j < name.length && name[j] === 'A') {
j++;
}
const right = i - 1; // 0번째 문자부터 i-1번째 문자까지 이동 수
const left = name.length - j; // 0번째 문자부터 왼쪽으로 커서를 이동하여 j번째 문자까지 이동 수
minMove = Math.min(minMove, left > right ? left + right * 2 : left * 2 + right);
// 'BBAA' 같이 오른쪽으로 이동하다 멈추는 경우
// left === 0 이다
// 마지막 문자가 'A'이므로 j === 마지막 인덱스+1
// 결과적으로 left * 2는 0으로 오른쪽으로만 i-1까지 이동
//'AABB'와 같은 경우도 마찬가지
// 왼쪽으로만 j까지 이동
i = j;
}
}
return sum + minMove;
}