

상하 이동 (각 알파벳 변경 횟수) 구하기
좌우 이동 최소값 탐색 구하기
테스트 케이스 추가
방법 1이 유리한 예시 (문제 예시들)
방법 2가 유리한 예시
class Solution {
public int solution(String name) {
int upDown = 0;
int length = name.length();
// 1. 상하 이동(각 알파벳 변경 횟수)
for (int i = 0; i < length; i++) {
char ch = name.charAt(i);
// 알파벳을 (A에서부터 변경, Z에서부터 변경 - 알파벳이 A에서 Z로 역순 이동하는 1번을 더해줌)
upDown += Math.min(ch - 'A', 'Z' - ch + 1);
}
// 2. 좌우 이동 최소값 탐색
int minMove = length - 1; // 기본은 오른쪽 끝까지 이동
for (int i = 0; i < length; i++) {
int next = i + 1;
// 연속된 A 구간의 끝을 찾음
while (next < length && name.charAt(next) == 'A') {
next++;
}
System.out.print("next : " + next);
// 방법 1 : 오른쪽으로 갔다가 왼쪽으로 돌아오는 경우 - 바꿀 문자가 왼쪽에 많고, A 다음 오른쪽이 짧을 때 유리
// i : 연속된 A구간 전까지 바꿔야 하는 알파벳 수, (length - next) : 연속된 A구간 이후에 바꿔야 할 알파벳 수
int move = i * 2 + (length - next);
// 방법 2 : 왼쪽으로 갔다가 오른쪽으로 도는 경우 - 바꿀 문자가 오른쪽에 많고, 앞쪽에서 되돌아가면 유리
int reverseMove = (length - next) * 2 + i;
System.out.print(" / move : " + move + " / reverseMove : " + reverseMove);
// 그 중 최소값 선택
minMove = Math.min(minMove, Math.min(move, reverseMove));
System.out.println(" / minMove : " + minMove);
}
return upDown + minMove;
}
}