조이스틱
🔍 알고리즘 분류
💡 문제 풀이
- 위아래 최소 조작:
min(name[L1] - 'A','Z' - name[L1] +1)
- 좌우 최소 조작
1) 정방향 이동 후 역방향으로 턴하는 경우
2) 역방향 이동 후 정방향으로 턴하는 경우
=> 위 두 경우 중 최솟값 선택
📄 코드
#include <string>
#include <vector>
#include <iostream>
#include <algorithm>
#define min(a,b) ((a) > (b) ? (b) : (a))
using namespace std;
int solution(string name) {
int answer = 0;
int L2 = 0;
int move = name.size() - 1;
int length = name.size();
for(int L1=0; L1 < name.size();L1++) {
answer += min(name[L1] - 'A','Z' - name[L1] +1);
int L2_idx = L1+1;
while(L2_idx < length) {
if(name[L2_idx] == 'A') L2_idx++;
else break;
}
L2 = length - L2_idx;
move = min(move, L1 + L2 + min(L1, L2));
}
return answer + move;
}