Contents
- 문제 설명
[제한사항]
[입출력 예] - 알고리즘 분석
[나의 풀이]
[Most 1 의 풀이]
문제 설명
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA
조이스틱을 각 방향으로 움직이면 아래와 같습니다.
더보기
조이스틱 방향키
▲ - 다음 알파벳
▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로)
◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
▶ - 커서를 오른쪽으로 이동
예를 들어 아래의 방법으로 JAZ를 만들 수 있습니다.
- 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다.
- 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다.
- 마지막 위치에서 조이스틱을 아래로 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
'프로그래머스(Python) > Level2' 카테고리의 다른 글
[프로그래머스] '라면 공장' 알고리즘 풀이 - Python (0) | 2020.02.06 |
---|---|
[프로그래머스] '짝지어 제거하기' 알고리즘 풀이 - Python (0) | 2020.02.04 |
[프로그래머스] '소수 만들기' 알고리즘 풀이 - Python (0) | 2020.02.04 |
[프로그래머스] '괄호 변환' 알고리즘 풀이 - Python (0) | 2020.02.03 |
[프로그래머스] 타겟 넘버 알고리즘 풀이 - Python (0) | 2020.01.30 |