A ~ N의 경우 N - character
O ~ Z의 경우 Z - character + 1
그래서 alphaMove[26]을 {0,1,2,3,4,5,6,7,8,9,10,11,12,13,12,11,10,9,8,7,6,5,4,3,2,1}; 같이 정의 할 수 있음
name의 길이가 n일때 n-1번 이동하면 됨
ex. JKL 오른쪽으로 2번이동하면 됨
ex. JAZAAAP
이 사례에서 우린 먼저 원점에서 J를 다루고 왼쪽키를 눌러 P로 넘어간다.
P를 다룬 후 왼쪽으로 가게되면 A를 3번이나 만나게 되므로 오른쪽으로 방향을 바꾸어 이동한다.
이때 Case2는 또한 2가지로 나뉘게 된다
원점 기준 오른쪽 문자중 하나의 인덱스를 x라하고
x 다음의 문자들중 A가 아닌 문자의 인덱스를 y라 하자
x + x + (n-y) : 오른쪽으로 x만큼 이동 + 왼쪽으로 x만큼 이동 + 왼쪽으로 (n-y)만큼 이동
(n-y) + (n-y) + x : 왼쪽으로 (n-y)만큼 이동 + 오른쪽으로 (n-y)만큼 이동 + 오른쪽으로 x만큼 이동
결론적으로 우린 Case2-1과 Case2-2중 작은 놈을 택해야 하기에
minMove = min(minMove, min(x+x+n-y, n-y+n-y+x) )를 해주어 minMove를 갱신한다
마지막으로 우리는 1번(조이스틱 상하 이동 최솟값)과 2번(조이스틱 좌우 이동 최솟값) 의 경우를 더해주어 answer를 찾으면 된다
#include<bits/stdc++.h>
using namespace std;
int solution(string name){
int upDownMove[26] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,12,11,10,9,8,7,6,5,4,3,2,1};
int ans = 0, n = name.size();
int leftRightMove = n-1;
for(int x = 0; x < n; x++){
ans += upDownMove[name[x]-'A'];
int y = x + 1; // x 오른쪽에 있으면서 A가 아닌 문자가 있는 위치를 y라하자
while( y < n && name[y] == 'A') y++;
leftRightMove = min( leftRightMove, min( x+x+(n-y), x+(n-y)+(n-y) ) );
}
ans += leftRightMove;
return ans;
}