programmers.co.kr/learn/courses/30/lessons/42860?language=python3
문제 설명
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA
조이스틱을 각 방향으로 움직이면 아래와 같습니다.
▲ - 다음 알파벳 ▼ - 이전 알파벳 (A에서 아래쪽으로 이동하면 Z로) ◀ - 커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서) ▶ - 커서를 오른쪽으로 이동
예를 들어 아래의 방법으로 JAZ를 만들 수 있습니다.
- 첫 번째 위치에서 조이스틱을 위로 9번 조작하여 J를 완성합니다. - 조이스틱을 왼쪽으로 1번 조작하여 커서를 마지막 문자 위치로 이동시킵니다. - 마지막 위치에서 조이스틱을 아래로 1번 조작하여 Z를 완성합니다. 따라서 11번 이동시켜 "JAZ"를 만들 수 있고, 이때가 최소 이동입니다.
만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.
제한 사항
- name은 알파벳 대문자로만 이루어져 있습니다.
- name의 길이는 1 이상 20 이하입니다.
입출력 예
namereturn
JEROEN | 56 |
JAN | 23 |
풀이
1.temp와 sample의 [i]번째 인덱스를 ord로 변환한다
그 후 두 값의 차이 계산.==> 그 차이많큼 조이스틱 움직여야함
temp의 값이 항상 클테니 temp - sample이 나을듯.
if.알파벳 개수는 26 따라서 차이가 13보다 크면 A에서 B쪽으로 순방향이
아닌 A에서 Z쪽으로 역방향으로 가는 것이 더 빠름.(최솟값)
else. 차이만큼 이동
==>빠져나오면 count =count + 차이값
맨바깥에 return count
++내가 까먹은 케이스가 있었다.
커서를 왼쪽으로 이동 (첫 번째 위치에서 왼쪽으로 이동하면 마지막 문자에 커서)
이 조건이 있었는데 만약 JAZ라는 이름이면 가운데 A는 이미 sample을 통해
완성이므로 커서를 오른쪽으로 이동이 아닌 왼쪽으로 한번의 이동을
하는 것이다.
그 때문에 A가 들어간 이름은 1씩 차이가 났었다.
++내가 짠 코드로는 60점 밖에 나오지 않아서 다른 분의 코드를 참고하여 작성했다.
1. 상하이동
2. 좌우이동 - while문
각 알파벳에대한 최소 이동값을 리스트에 담고,
while문을 돌면서 answer에 각값을 더하고 0으로 만들어준다.
모든 값이 0이면 빠져나옴
좌우로 이동방향을 정할 때 바꿔야하는 알파벳이 나오기까지의 가장 짧은거리 구함.
왼쪽,오른쪽 비교해서 작은값으로
def solution(name):
make_name = [min(ord(i) - ord("A"), ord("Z") - ord(i)+1) for i in name]
idx, answer = 0, 0
while True:
answer += make_name[idx]
make_name[idx] = 0
if sum(make_name) ==0:
break
left, right = 1, 1
while make_name[idx - left] ==0:
left +=1
while make_name[idx + right] ==0:
right +=1
answer += left if left < right else right
idx += -left if left < right else right
return answer
'Algorithm > Online judge' 카테고리의 다른 글
[프로그래머스] 연습문제 > 땅따먹기 (0) | 2021.01.26 |
---|---|
[프로그래머스] 연습문제 > 소수 만들기 (0) | 2021.01.26 |
[프로그래머스] 연습문제 > 가장 큰 정사각형 찾기 (0) | 2021.01.26 |
[프로그래머스] Summer/Winter Coding(~2018) > 영어 끝말잇기 (0) | 2021.01.26 |
[프로그래머스] 연습문제 > JadenCase 문자열 만들기 (0) | 2021.01.26 |