프로그래머스(Python)/Level2

[프로그래머스] 조이스틱 알고리즘 풀이 - Python

Jinomad 2020. 1. 30. 13:21

Contents

  1. 문제 설명

    [제한사항]

    [입출력 예]
  2. 알고리즘 분석 

    [나의 풀이]

    [Most 1 의 풀이]

 

문제 설명

 

 

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.

 

ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA

 

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

 

 

더보기

조이스틱 방향키 

▲ - 다음 알파벳

▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)

◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)

▶ - 커서를 오른쪽으로 이동

 

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

 

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

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

 

 

제한사항

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

 

입출력 예

name  return
'JEROEN' 56
'JAN' 23



알고리즘 분석

 

  • 나의 풀이
import re

def solution(name):
    idx, count = 0, 0 # name을 지정할 인덱스와 이동한 횟수를 저장할 변수를 지정
    p = re.compile('[B-Z]') # 'A'를 제외한 모든 문자를 정규표현식으로 지정 
    
    while True:
        m = p.search(name) # 'A'외의 다른 알파벳이 문자열에 속해있는지 확인
        if m: # 다른 알파벳이 있다면 if문을 실행
            num = ord(name[idx]) # name[idx]의 값을 아스키코드의 숫자 값으로 변환하여 num에 저장 
            # 조이스틱을 위로 옮기는 경우 : num-65
            # 조이스틱을 아래로 옮기는 경우 : 91-num 
            count += min(num-65, 91-num) # 둘 중 작은 값을 count에 더한다. 
            name = name[:idx] + 'A' + name[idx+1:] # name[idx]는 'A'로 변환한다. 
			
            nr_idx, nl_idx = idx, idx # 좌우로 움직일 인덱스 값
            for i in range(len(name)): 
                if nr_idx >= len(name): # nr_idx가 len(name)의 값과 같거나 초과할 경우 0으로 초기화 
                    nr_idx = 0
                if nl_idx < 0: # nl_idx가 0보다 작을 경우 len(name)-1로 초기화
                    nl_idx = len(name)-1 
                if name[nr_idx]!='A': # 'A'이외의 다른 값이 나올 경우
                    idx = nr_idx # nr_idx가 지정한 곳으로 idx가 이동
                    count += i # 이동한 만큼의 횟수를 count에 추가
                    break # 반복문 탈출 
                if name[nl_idx]!='A':
                    idx = nl_idx # nl_idx가 지정한 곳으로 idx가 이동
                    count += i
                    break
                nr_idx += 1 # nr_idx는 오른쪽으로 이동
                nl_idx -= 1 # nl_idx는 왼쪽으로 이동 
        else: #'A'외의 알파벳이 없다면 반복문 탈출
            break
    return count