조이스틱으로 알파벳 이름을 완성하는 문제다.
맨 처음엔 A로만 이루어져 있다.
조이스틱을 각 방향으로 움직이면 아래와 같다.
▲ - 다음 알파벳
▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동
name | return |
---|---|
"JEROEN" | 56 |
"JAN" | 23 |
def count_min_updown(alphabet, a_order, z_order):
return min(ord(alphabet) - a_order, z_order - ord(alphabet) + 1)
def count_min_step(name):
a_order, z_order = (ord('A'), ord('Z'))
prev = 0
step = 0
for i in range(len(name)):
alpha = name[i]
if alpha == 'A':
continue
step += count_min_updown(alpha, a_order, z_order)
step += i - prev
prev = i
return step
def solution(name):
a_order, z_order = (ord('A'), ord('Z'))
size = len(name)
step = count_min_step(name)
if not step:
return step
# 'A' 아닌 문자 위치 찾기
stop_idx = 0
for i in range(size):
if name[i] != 'A':
stop_idx = i
break
# 'A' 아닌 문자 이후부터 reverse
reverse_name = name[:stop_idx:-1]
stop_updown = count_min_updown(name[stop_idx], a_order, z_order)
if not reverse_name:
stop_idx = 0
stop_step = stop_updown + stop_idx * 2 + 1
reverse_step = stop_step + count_min_step(reverse_name)
return min(step, reverse_step)
if __name__ == '__main__':
result = solution("AAAB") # 2
print(result)