Algorithm/프로그래머스

[프로그래머스/Python] 조이스틱 - Level2

poppy 2021. 6. 13. 13:46
반응형

https://programmers.co.kr/learn/courses/30/lessons/42860

 

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

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

programmers.co.kr

조이스틱을 움직일 때 움직인 마지막 위치에서 최소거리를 구해야하는 줄 알고 생각하다가 방법이 생각나지 않아서 다른 사람 풀이를 보려고 검색했는데 완전히 잘못 이해하고 있었다...ㅋㅋㅋㅋ 다음 위치로 넘어가면 조이스틱이 A에서 시작하는 것이었다... 이 사실을 알고 다시 생각해보았더니 방법이 생각났다

 

이 문제는 상하로 움직이는 로직과 좌우로 움직이는 로직으로 나뉜다. 상하로 움직이는 로직은 name - A의 거리와 Z - name의 거리 중 최소 거리로 움직이면 된다. 좌우로 움직이는 로직은 A는 움직일 필요가 없으므로 왼쪽으로 움직일 때 A가 아닌 글자가 나오는 거리와 오른쪽으로 움직일 때 A가 아닌 글자가 나오는 거리 중 최소 거리로 움직이면 된다.

 

def solution(name):
    alpha = [min(ord(i) - ord('A'), ord('Z') - ord(i) + 1) for i in name] #상하 최소 거리 구하여 저장
    i, answer = 0, 0
    
    # 조이스틱을 움직여 글자 완성하기
    while True:
        answer += alpha[i] 
        alpha[i] = 0 # 이동이 끝났으면 값을 0으로 만듬
        
        # 모든 값이 0이 되면 글자가 완성되었으므로 답을 리턴해줌
        if sum(alpha) == 0:
            return answer
        
        left, right = 1, 1 # 왼쪽과 오른쪽으로 움직일 거리
        # 이동해야 할 글자가 나올 때까지 반복
        while alpha[i - left] == 0: 
            left += 1
        while alpha[i + right] == 0:
            right += 1
        
        # left, right 중 최소거리 구하여 다음 위치로 이동
        if right > left:
            answer += left
            i -= left
        else:
            answer += right
            i += right

먼저 answer에 현재 위치에서 이동해야 할 최소거리를 더해주고 이동이 끝났음을 나타낼 수 있도록 현재 위치 값을 0으로 바꿉니다. alpha의 모든 값이 0이 되면 글자가 완성된 것이므로 답을 리턴해주면 됩니다. 만들어야 할 글자가 A라면 alpha에 0으로 되어있을 것이고, 이동이 끝난 글자도 0으로 되어있을 것입니다. 이동해야 할 글자가 나올 때까지 위치를 이동해야하므로 왼쪽으로 이동할 때와 오른쪽으로 이동할 때의 거리를 구합니다. 구한 후 둘 중 최소거리를 구해서 다음 위치로 이동시킵니다. 이 로직이 반복되다가 모든 글자가 완성되면 답이 리턴되게 됩니다.

 

반응형