본문 바로가기
🖥️ 문제 풀이/프로그래머스

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

by 뒬탕 2022. 10. 14.
반응형

프로그래머스 해답 및 해설

 

문제 : 조이스틱

바로가기

 

문제 설명

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

조이스틱을 각 방향으로 움직이면 아래와 같습니다.
▲ - 다음 알파벳
▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동 (마지막 위치에서 오른쪽으로 이동하면 첫 번째 문자에 커서)

예를 들어 아래의 방법으로 "JAZ"를 만들 수 있습니다.
- 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다.
- 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다.
- 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다. 따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.

만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.

 

제한 조건

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

 

입출력 예

입력 출력
"JEROEN" 56
"JAN" 23

 

해답 및 해설

파이썬 (Python)

def solution(name):
    answer = 0
    for char in name:
        char_diff = ord(char) - ord('A')
        answer += min(char_diff, 26-char_diff)
    
    move = len(name)-1
    for i in range(1, len(name)):
        right = len(name[1:i].rstrip('A'))
        left = len(name[i:].lstrip('A'))
        move = min(move, 2*right+left, 2*left+right)

    answer += move
    
    return answer

탐욕법으로 풀으라고 문제는 정해놨지만, 완전탐색으로 푼 문제

 

우선 조이스틱을 위 아래로 움직이는 것은 별다르게 생각할 요소가 없다. 위로 움직여서 찾는 경우와 아래로 움직여서 찾는 경우를 비교해줘서 작은 값을 더해주면 된다.

 

문제는 좌우로 움직이는 경우다. 문자열에 A가 없으면 좌로 돌든 우로 돌든 다 한번씩 거치게 되니까 상관없는데, A가 있는 경우에는 매우 복잡해진다. 어떤 방법으로 A를 거치지 않을 것인지가 중요해지기 때문이다. 아래 예시와 같이 말이다.

  • BBBBAAAA : 오른쪽으로 3칸만 가주면 된다.
  • BAAAABBB : 왼쪽으로 3칸을 가주어야 한다.
  • BBAAAABB : 오른쪽으로 한칸 갔다가 되돌아오고, 다시 왼쪽으로 2칸 가주어야 한다.
  • BBBBABBB : 그냥 왼쪽 또는 오른쪽으로 쭉 가는게 빠르다.

그래서 그냥 중간에서 문자열을 자른 다음, 그냥 쭉 가는 경우와 왼쪽으로 갔다 오른쪽, 오른쪽으로 갔다가 왼쪽으로 가는 경우를 완전탐색으로 비교해주었다. 물론 A가 연속됐을 때는 넘어간다거나 하는 식으로 횟수를 줄일 수도 있었겠지만, 그렇게까지 해서 줄이기에는 찾아봐야할 경우의 수가 적고 코드가 복잡해지므로 그렇게 하지 않았다.

반응형

댓글