function solution(name) {
var answer = 0;
let ascCnt = 0;
let descCnt = 0;
let nameArr = name.split("");
let forwardArr = name.split("");
let reverseArr = forwardArr.slice(0, 1).concat(name.split("").reverse().slice(0, name.length - 1));
if (nameArr.filter((x) => x != "A").length < 1) return 0;
for (var i = 0; i < name.length; i ++) {
if (forwardArr.filter((x) => x != "A").length > 0) {
ascCnt++;
forwardArr = forwardArr.slice(1);
let lastChar = "";
if (forwardArr.length * 1.0 / 2 < forwardArr.findIndex((x) => x != "A")) {
lastChar = forwardArr[0];
forwardArr.reverse();
forwardArr.pop();
forwardArr.unshift(lastChar);
}
}
if (reverseArr.filter((x) => x != "A").length > 0) {
descCnt++;
reverseArr = reverseArr.slice(1);
}
}
ascCnt = ascCnt > 0 ? ascCnt-1 : 0;
descCnt = descCnt > 0 ? descCnt-1 : 0;
for (var i = 0; i < nameArr.length; i ++) {
if (nameArr[i] == 'A') continue;
let code = nameArr[i].charCodeAt();
if (code > 78) {
answer += 25 - Math.abs(code - 65) + 1;
} else {
answer += Math.abs(code - 65);
}
}
answer = ascCnt > descCnt ? answer + descCnt : answer + ascCnt;
return answer;
}
처음 문제 풀 때 고려했던 4가지는 아래와 같다
그런데 위 4가지만 고려하고 코드를 짰을 때는, 테스트케이스에서 1개가 계속 실패했다.
추가로 고려해야했던 상황은
처음엔 정방향으로 갔다가 다시 역순으로 가는게 빠를 때! 이 케이스를 누락했다.
어차피 첫 번째 문자에서 왼쪽 커서를 눌러 오른쪽으로 가게되면 다시 오른쪽으로는 갈 수 없기 때문에
if (forwardArr.length * 1.0 / 2 < forwardArr.findIndex((x) => x != "A")) 이 if 문에 걸리는 경우 그냥 배열을 첫 번째 문자 제외하고 역순으로 뒤집어 버렸다.
어렵다 어려워 알고리즘...
더 좋은 방법이 없나 서치 좀 해봐야겠다.