[프로그래머스] Python - Lv.2 - 조이스틱

·2023년 7월 8일
0

코테 풀기

목록 보기
13/26
post-thumbnail

조이스틱

문제

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

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

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

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

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

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


제한 사항

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

입출력

문제 바로가기

프로그래머스-탐욕법-조이스틱


✏️ 분석 및 풀이

💡문제 분석

  1. 알파벳 변경 (A -> 특정 알파벳) 횟수 구하기
  2. 이동 횟수

아래 사진을 봤을 때, A를 기준으로 왼쪽의 문자부터 바꾸는 방법과 오른쪽의 문자부터 바꾸는 방법, 그리고 A를 거치면서 첫번째 문자부터 마지막 문자까지 바꾸는 방법 이렇게 3가지가 있다.

1. 알파벳 변경 횟수 -> ord()이용

  • A → 알파벳 : ord('알파벳') - ord('A')
  • A → Z → 알파벳 : ord('Z') - ord('알파벳') + 1

예를 들어, 알파벳이 J라고 했을 때
1. A → J : 74 - 65 = 9
2. A → Z → J : 1 + 90 - 74 = 17
때문에 이 두가지의 값을 비교하는 코드는 아래와 같다.

# 알파벳 변경 횟수
answer += min(ord(letter)-ord('A'), ord('Z')-ord(letter)+1)

2. 이동 횟수

  • A를 기준으로 왼쪽부터 이동하여 알파벳 변경
  • A를 기준으로 오른쪽부터 이동하여 알파벳 변경
  • 처음부터 마지막까지 순서대로 이동하여 알파벳 변경


위 사진과 같이 3가지 방법에 대한 횟수를 비교하여, 최솟값을 구해야한다.

nexti의 인덱스값이 가리키는 값의 다음 값을 의미한다. while반복문을 통해 연속적으로 A인 위치를 확인한다.

next_ = i+1
while(next_ < len(name) and name[next_]=='A'):
	next_ += 1

💡풀이

def solution(name):
    answer = 0
    move = len(name)-1

    for i, letter in enumerate(name):
        print(i, letter)
        # 알파벳 변경 횟수
        answer += min(ord(letter)-ord('A'), ord('Z')-ord(letter)+1)

        # 이동 횟수
        next_ = i+1
        while(next_ < len(name) and name[next_]=='A'):
            next_ += 1

        move = min([move, 2*i + len(name)-next_, i + 2*(len(name)-next_)])
    answer += move
    return (answer)

0개의 댓글