본문 바로가기
알고리즘 문제 풀이/Programmers

[16회차] 조이스틱

by 중앙백 2021. 12. 26.

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함수]

댓글