[프로그래머스 Lv2] 조이스틱(python)

이진규·2022년 5월 12일
1

프로그래머스(PYTHON)

목록 보기
54/64

문제

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

나의 코드

"""

"""

def solution(name):
    
    # 조이스틱 조작 횟수
    answer = 0
    
    # 한 방향으로만 이동했을 때 좌우 이동 횟수
    moves = len(name) - 1
    
    for idx, alpha in enumerate(name):
    
        # 해당 알파벳 변경 최소값 추가
        answer += min(ord(alpha) - ord('A'), ord('Z') - ord(alpha) + 1)
    
        # 해당 알파벳 이후 연속된 A 문자열의 다음 인덱스 찾기 (문제에서 A가 기본 값이기 때문에 A를 찾음)
        next = idx + 1
        while next < len(name) and name[next] == 'A':
            next += 1
    
        """ min(기존 방식 / A 문자열 까지(idx) + 다시 왼쪽으로 진행(idx + len(name)-next) /
        A 문자열 까지(len(name)-next) + 다시 오른쪽으로 진행(len(name)-next + idx) """
        moves = min( [moves, idx + idx + ( len(name) - next ), idx + 2 * ( len(name) - next) ] )
    
    # 좌,우 이동의 최소값을 더해 줌.
    answer += moves
    return answer
    

설명

테스트 케이스가 바뀌었는지 블로그에 틀린 정보도 많고 이해하기도 어려웠다.

문제의 핵심은 다음과 같다.

  • 상하(알파벳 변경), 좌우(커서 변경)의 횟수를 분리해서 최소값으로 세고 더해주기.
  • 연속되는 A가 있을 때, 그것의 왼쪽이나 오른쪽부터 시작하며 알파벳을 변경하는 것이 가장 효율적.

위의 핵심을 기준으로 코드를 작성하면 된다. 한번에 이해하기는 어려우니 여러번 풀어봐야 한다. 자세한 내용은 코드에 주석을 달아놓음!

참고 자료

https://velog.io/@jqdjhy/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%ED%8C%8C%EC%9D%B4%EC%8D%AC-%EC%A1%B0%EC%9D%B4%EC%8A%A4%ED%8B%B1-Greedy

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글