프로그래머스 Level 2 - 조이스틱
📌 문제 설명
![](https://velog.velcdn.com/images%2Ftnehd1998%2Fpost%2Fad5fab3f-41ac-4fc2-8a31-52203cbfd15c%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.25.50.png)
![](https://velog.velcdn.com/images%2Ftnehd1998%2Fpost%2F873234a0-8f31-4300-8b05-49080cc44f88%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-12-25%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%209.26.05.png)
📌 생각한 풀이 방법
- 해당 문자의 자릿수만큼 계산을 하며 오른쪽으로 이동한다.
- A가 나오는 경우 연속적으로 나온 A의 갯수를 계산한다.
- 연속된 A의 숫자가 현재 index+1보다 큰 경우 차이를 빼서 반대로 돌아간 효과를 준다.
- 최종적으로 사용된 횟수를 반환한다.
📌 풀이
function solution(name) {
let answer = 0;
let arr = [0];
for (let i = 0; i < name.length; i++) {
if (name[i] === "A") {
if (i === 0) {
arr.push(calculateRepeatingA(name) - 1);
} else if (name[i - 1] !== "A") {
arr.push(calculateRepeatingA(name.slice(i)) - (i - 1));
}
answer++;
} else {
answer += calculateCount(name[i]) + 1;
}
}
return answer - Math.max(...arr) - 1;
}
function calculateCount(value) {
return value.charCodeAt() - 65 < 91 - value.charCodeAt()
? value.charCodeAt() - 65
: 91 - value.charCodeAt();
}
function calculateRepeatingA(name) {
let count = 0;
for (let i = 0; i < name.length; i++) {
if (name[i] !== "A") break;
count++;
}
return count;
}