Algorithm/Online judge

[프로그래머스] 탐욕법(Greedy) > level 2 >조이스틱

민철킹 2021. 1. 26. 17:17

programmers.co.kr/learn/courses/30/lessons/42860?language=python3

 

코딩테스트 연습 - 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다

programmers.co.kr

문제 설명

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 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

 

 

반응형