문제:
조이스틱으로 알파벳 이름을 완성하세요.
조이스틱 룰
▲ - 다음 알파벳
▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동 (마지막 위치에서 오른쪽으로 이동하면 첫 번째 문자에 커서)
만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return
문제해결 방향
1. 알파벳조작:
중간값인 13으로 인덱스 비교
- 자바는 charAt() 메소드로 아스키코드를 이용해 알파벳간의 비교가 가능
- python도 ord() / char() 메소드를 사용하면 가능
2. 이동 조작:
조작횟수의 최솟값이므로 Math.min()을 사용
이동방법 경우의수:
- 걍 오른쪽으로 쭉쭉: 전체길이 -1
- 왼쪽으로 함 돌아갔다가 끝으로 가서 왼쪽으로 쭉:
i*2 + 전체-연속되는 A끝나는지점
- 시작하자마자 왼쪽으로가서 A나올때까지 갔다가 돌아나와서 처음으로 간후 다시 A연속이 시작되는 지점까지 가기:
i + 전체-연속끝지점 *2
#min 비교 주의점:
python은 여러개비교가가능하지만 자바는 두개씩만 비교
class Solution {
public int solution(String name) {
int answer = 0;
int length = name.length();
int move = length - 1;
int index = 0;
for (int i = 0; i < name.length(); i++){
answer += Math.min(name.charAt(i)-'A','Z'-name.charAt(i) +1);
index = i + 1;
while (index < length && name.charAt(index) == 'A'){
index++;
}
move = Math.min(move, i*2 + length -index);
move = Math.min(move, i + (length-index)*2);
}
return answer + move;
}
}
def solution(name):
answer = 0
alp = list("ABCDEFGHIJKLMNOPQRSTUVWXYZ")
move = len(name) -1
length = len(name)
for i,char in enumerate(name):
if alp.index(char)<=13:
answer += alp.index(char)
else:
answer += (26 - alp.index(char))
index = i+1
while index <length and name[index] == "A":
index += 1
move = min(move, i*2 + length - index, (length - index)*2 + i )
return answer + move