Programmers Level.2 조이스틱
def move(x):
if ord(x) - 65 <= 91 - ord(x):
return ord(x) - 65
else:
return 91 - ord(x)
def find_lefta(string): # 왼쪽부터 a 찾기
is_a = False
for i in range(1, len(string)): # 첫 번째는 어떤 알파벳이든 상관없고 두 번째부터 중요.
if not is_a and string[i] == 'A':
is_a = True
a = i
if is_a and string[i] != 'A':
return a, i
if not is_a:
return 1, 0
else:
return a, len(string)
def find_righta(string): # 오른쪽에서 a 찾기
if string[-1] == 'A':
for i in range(len(string)-1, -1, -1):
if string[i] != 'A':
return i
return 0
else:
return len(string) - 1
def solution(name):
answer = 0
for i in name:
answer += move(i)
if answer == 0:
return answer
a, b = find_lefta(name)
c = find_righta(name)
if 2 * (a-1) + len(name) - b > c:
answer += c
else:
answer += 2 * (a-1) + len(name) - b
return answer
- 조이스틱의 위 버튼과 아래 버튼 중 어떤 버튼으로 조작해야 하는지 판별하기 위해 move 함수를 만들었다.
- A는 위아래 버튼으로 조작할 필요가 없기 때문에 좌우 버튼으로 모든 알파벳을 다 확인해야할 필요는 없다.
- 가능한 경우의 수는 1) 첫 번째 위치에서 c 까지 이동. [find_righta함수]
- 2) 첫 번째 위치에서 a까지 이동 후, 다시 첫 번째로 이동. 첫 번째 위치에서 왼쪽 버튼을 눌러 마지막 문자로 이동한 뒤에 b 까지 이동. [find_lefta함수]
'알고리즘 문제 풀이 > Programmers' 카테고리의 다른 글
[18회차] 캐시 (0) | 2021.12.28 |
---|---|
[17회차] 괄호 회전하기, H-index, 예상 대진표, 순위 검색, 올바른 괄호 (0) | 2021.12.27 |
[15회차] 빛의 경로 사이클, 가장 큰 수 (0) | 2021.12.25 |
[14회차] (0) | 2021.12.21 |
[13회차] (0) | 2021.12.17 |
댓글