https://school.programmers.co.kr/learn/courses/30/lessons/42860#
문제
풀이
1) 상하일 경우 먼저 계산한다.
2) A의 연속되는 부분을 찾는다. 이에 따라 앞으로 갈지 뒤로 갈지 결정된다.
3) 좌우 이동일 경우 3가지가 있는데 이 3가지 중 가장 빠른 것을 결정한다.
1) 처음 -> 오른쪽 끝
2) 뒤로 이동
3) 연속된 A의 앞쪽보다 뒷쪽이 짧은 경우, 뒷쪽부터 조작
소감
진짜 상당히 어려웠던 문제. 내가 그리디를 좆같이 못하는게 맞구나...
근데 이거 그리디 아닌거 같은데...
코드
class Solution {
public int solution(String name) {
int answer = 0;
int move = name.length()-1; // 가장 큰 이동 값은 처음부터 끝까지 이동
for(int i=0; i<name.length(); i++){
char now = name.charAt(i);
answer += Math.min(now-'A', 'Z'-now+1); // 상하
System.out.println(Math.min(now-'A', 'Z'-now+1));
// 좌우 : 연속된 A에 따라 달라짐
int next = i+1; // 다음 위치부터
// 다음이 계속 A라면 next++;
while(next<name.length() && name.charAt(next)=='A') next++;
// 순서대로 가는것 vs 뒤로 가는 것
move = Math.min(move, (i*2)+name.length()-next);
// 처음부터 뒷부분을 먼저 입력하는 것이 더 빠른 경우도 계산.
move = Math.min(move, (name.length()-next)*2+i);
}
return answer+move;
}
}