문제 링크
풀이
로직
상하 움직임
- A가 아닌 값은 위아래로 몇번 움직이면 되는지 구하면 된다
- A~Z까지
diff
에 위 or 아래로 몇번 움직이는게 최단인지 담아둔다.
diff
길이가 알파벳 갯수와 동일하고
diff
의 idx는 알파벳에서의 idx와 동일 => diff
에서 idx 1번은 B를 의미, idx 25번은 Z를 의미
int answer = 0;
int[] diff={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};
for(char c:name.toCharArray())
answer+=diff[c-'A'];
좌우 움직임
- 좌우 움직임을 가져가려면 1) 우측 + 우측되돌아가기 + 좌측, 2) 좌측 + 좌측되돌아가기 + 우측 이 두가지가 우측으로만 움직였을때 보다 작아야한다.
- 맨앞쪽 or 맨뒤쪽 연속된 A가 있을경우 => 우측으로만 움직이거나, 좌측으로만 움직이거나 하면된다.
- (참고) 맨앞쪽에 연속된 A가 있는 경우는 아래 코드에서 좌측으로 움직이는 경운 i=0인 경우로 고려됨
- 즉, 우측 0회 + 우측되돌아가기 0회 + 좌측 n회 이렇게 계산되니 => 좌측으로만 몇회 움직였는지로 계산됨
- 중간에 A가 있는 경우 => 이경우가 좌우로 모두 움직임 가져가야하는 경우임
int length=name.length();
int min=length-1;
for(int i=0;i<length;i++){
int next=i+1;
while(next<length && name.charAt(next)=='A'){
next++;
}
min = Math.min(min, i + length-next + Math.min(i, length-next) );