[프로그래머스-Greedy] 조이스틱

CHOI YUN HO·2021년 4월 3일
0

알고리즘 문제풀이

목록 보기
17/63

📃 문제 설명

조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA

조이스틱을 각 방향으로 움직이면 아래와 같습니다.

▲ - 다음 알파벳
▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동

예를 들어 아래의 방법으로 "JAZ"를 만들 수 있습니다.

- 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다.
- 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다.
- 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다.
따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.
만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.

제한사항

  • name은 알파벳 대문자로만 이루어져 있습니다.
  • name의 길이는 1 이상 20 이하입니다.

[문제 출처 : 프로그래머스]

👨‍💻 해결 방법

나의 생각의 흐름을 주절주절..

알파벳을 변경하는 조작과, 커서를 이동하는 조작 두 가지를 고려해야 한다.

우선 알파벳을 앞에서부터 조작할 때와 뒤에서부터 조작할 때의 횟수를 계산해서 조작 횟수를 최소로 해야 한다.
이것은 뭐 처음엔 A로만 이루어져 있고, 알파벳은 26개니까 13번째 알파벳부터는 뒤에서부터 조작하도록 한다.

그렇게 조작해야 하는 횟수를 arr에 따로 저장해준다.

그리고 커서의 이동이 조금 어려웠는데, arr를 이용해서 이미 조작이 완료된 위치는 0으로 바꾸고 0에 도달할 때 까지 왼쪽, 오른쪽 중 어느 쪽이 최소 이동인ㄴ지 계산하여 알맞게 커서 이동 횟수를 카운트한다.

결론

알파벳을 변경하기 위한 조작 횟수를 arr에 저장하고,조작이 완료된 위치는 0으로 하여, 커서 이동 횟수의 최솟값을 구하여 문제를 해결한다.

👨‍💻 소스 코드

def solution(name):
    answer = 0
    arr = []

    for n in name:
        controlCount = ord(n) - 65
        if controlCount > 13:
            arr.append(26 - controlCount)
        else:
            arr.append(controlCount)

    i = 0
    while True:
        answer += arr[i]
        arr[i] = 0
        if sum(arr) == 0:
            break
        left, right = 1, 1
        while arr[i - left] == 0:
            left += 1
        while arr[i + right] == 0:
            right += 1
        answer += left if left <= right else right
        i += -left if left < right else right

    return answer
profile
가재같은 사람

0개의 댓글