https://school.programmers.co.kr/learn/courses/30/lessons/42860
class Solution {
static public int solution(String name) {
int answer = 0;
int n = name.length();
int upDown = 0;
int leftRight = n - 1;
for (int i = 0; i < n; i++) {
if (name.charAt(i) <= 'N') {
upDown += name.charAt(i) - 65;
} else {
upDown += 91 - name.charAt(i);
}
// 연속된 A의 다음 문자를 찾을 때까지 탐색
int nextMove = i + 1;
while (nextMove < n && name.charAt(nextMove) == 'A') {
nextMove++;
}
leftRight = Math.min(leftRight,
Math.min(i + i + (n - nextMove), (n - nextMove) + (n - nextMove) + i));
}
answer = upDown + leftRight;
return answer;
}
}
이 문제의 핵심을 정리하자면 다음과 같다.
조이스틱을 좌우로 최소한으로 움직이는 경우는 3가지가 있다.
원점으로부터 오른쪽 끝까지 탐색하는 경우 => n - 1
원점으로부터 x까지 이동하고 다시 왼쪽으로 이동해서 y까지 탐색하는 경우
=> x + x + (n - y)
: 오른쪽으로 x만큼 이동 + 다시 왼쪽으로 x만큼 이동 + 왼쪽으로 y까지(n-y) 이동
원점으로부터 왼쩍으로 이동해 y까지 탐색하고 다시 오른쪽으로 x까지 탐색하는 경우
=> (n - y) + (n - y) + x
: 왼쪽으로 y까지(n-y) 이동 + 오른쪽으로 원점까지(n-y) 이동 + 오른쪽으로 x까지 이동