조이스틱을 좌우로 움직이는 부분에 대해 생각하는 것이 어려운 문제이다. 아직도 제대로 이해하지 못한 것 같은 문제이다. 해당코드는 다른 풀이를 참조하였다.
풀이의 핵심적인 부분은 현재 i에서 다음 A가 아닌 문자의 idx를 구한후 i와 idx를 찍는 두가지의 경우에서 최소값을 채택하는 것이다.
1) i먼저 갔다 idx => 0 ~ i + i ~ 0 + 0 ~ idx=> i + i + size - idx
2) idx먼저 갔다 i => 0 ~ idx + idx ~ 0 + 0 ~ i => (size - idx) + (size - idx) + i
둘중 작은 값을 채택하면 된다.
예제는 두개의 A가 아닌 문자열에 대해 판별하는 것과 같아보여서 A가 없거나 하나만 있는경우에 대한 의문이 들수도있다.
쉽게 이해하려면 i가 A라 생각하고 이해하면 편하다.
간단한 예시로 ABAA 대해 생각해보면 이해가 쉬울것이다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int solution(string name) {
int answer = 0;
int size = name.size();
int turn = size - 1;
for (int i = 0; i < size; i++) {
answer += min(name[i] - 'A', 26 - (name[i] - 'A'));
int idx = i + 1;
while (idx < size && name[idx] == 'A')
idx++;
turn = min(turn, i + size - idx + min(i, size - idx));
}
answer += turn;
return answer;
}