[문제풀이] 조이스틱
업데이트:
문제 링크 : 조이스틱
풀이 시간 : 30분
1. 문제 풀이
조이스틱을 최소로 움직이는 방법을 찾아야한다.
문제를 크게 2개로 나눠서 계산했다.
1) 각 문자에서 A에서 시작해서 위로 갈지(B,C,D…), 아래로 갈지(Z,Y,X …) 판단
2) 각 문자로 가기 위한 이동 방법 오른쪽으로만 갈지, 왼쪽으로 갔다가 오른쪽으로 갈지, 오른쪽으로 갔다가 왼쪽으로 갈지를 판단
2. 소스 코드
int temp = name.charAt(0) - 'A';
int answer = 0;
//첫 번째 자리는 위아래만 이동
if (temp < 13) {
answer += temp;
} else {
// 13 이상이면 뒤부터 하는 것이 더 빠르다
answer += (26 - temp);
}
boolean flag = false;
// 기본적으로 오른쪽으로 이동
// 오른쪽으로만 이동 시 문자열 길이 -1 만큼 이동
int min = name.length()-1;
int start = 0;
for (int i = 1; i < name.length(); i++) {
// A는 갈 필요가 없기 때문에
// 그 위치를 기준으로 나눈기 위함
if (name.charAt(i) == 'A') {
if (!flag) {
flag = true;
start = i-1;
}
continue;
}
// 연속적인 A가 끝났을 때
if(flag) {
// 오른쪽을 갔다가 왼쪽으로 가는 것이 빠른지, 왼쪽으로 갔다가 오른쪽으로 가는 것이 빠른지 아니면 그냥 오른쪽으로 가는게 빠른지 판단
min = Math.min(min, Math.min(start*2+name.length()-i,(name.length()-i)*2+start));
}
flag = false;
// 1) 판단 문자 기준으로 아래로 이동이 빠른지, 위로 이동이 빠른지
int c = name.charAt(i) - 'A';
if (c < 13) {
answer += c;
} else {
answer += (26 - c);
}
}
answer+=min;
return answer;
}
3. 후기
Level 2 문제여서 쉽게 생각했다.
처음에 단순히 각 위치에서 위로 갈지 아래로 갈지만 판단하면 되는 줄 알았다.
문자 위치로 이동하기 위한 방법이 3가지가 존재한다는 것을 뒤늦게 인지하였다.
4. 주의
예시로 ABABAAAAABA 같은 경우
1) 오른쪽으로만 이동시 좌우이동(9개)+상하이동(3개)
2) 오른쪽 이동 후 왼쪽 이동 시 좌우이동(8개)+상하이동(3개)
3) 왼쪽 이동 후 오른쪽 이동시 좌우이동(7개)+상하이동(3개)