개념 접근은 제대로 했는데 단방향의 케이스에서 실수를 해 애먹은 문제이다.
핵심은 포인트 두개를 잡고 왼오로 갈때 오왼으로 갈때의 케이스들중 최소값을 찾으면 된다.
#include <string>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std;
// 고득점
int main() {
int t;
string s;
cin >> t;
while (t--) {
cin >> s;
int answer = 0, move = INT32_MAX, size = s.size();
for (int i = 0; i < size; i++) {// 각 자리별로 단어 몇개 돌려야 하는지 계산
answer += min(s[i] - 'A', 'Z' - s[i] + 1);
if (s[i] != 'A') s[i] = 'B';
}
for (int i = 0, j; i < size; i++) {// 포인트 둘을 잡고 왔다 갔다 최소 계산
j = find(s.begin() + i + 1, s.end(), 'B') - s.begin();
int right = i * 2 + size - j;
int left = i + (size - j) * 2;
// cout << i << " " << j << ": " << right << " " << left << "\n";// 흐름이 잘 안보일때 추가해서 보면 이해하기 쉽다.
move = min(move, min(left, right));
}
cout << answer + move << "\n";
}
}