조이스틱

박진은·2023년 5월 1일
0

코테

목록 보기
32/44

조이스틱 계산하기

https://school.programmers.co.kr/learn/courses/30/lessons/42860
문제는 이곳에서 참조 바란다.

def solution(name):
    if set(name) == {'A'}: # 모든 글자가 A일 경우 움직일 필요 없음
        return 0

    answer = float('inf') # 최소 이동 횟수 초기화
    for i in range(len(name) // 2): # 반 이상 움직일 필요 없음
        left = name[-i:] + name[:-i] # 왼쪽으로 i칸 이동한 문자열
        right = name[i:] + name[:i] # 오른쪽으로 i칸 이동한 문자열

        # 더 적은 이동 횟수를 구하기 위해 left, right 문자열 중 A로 끝나는 부분을 제거
        for n in [left, right[0] + right[:0:-1]]:
            while n and n[-1] == 'A': # 문자열 n의 마지막 문자가 A일 경우 제거
                n = n[:-1]
                print(n)

            # row_move: 알파벳 변경을 위한 이동 횟수
            row_move = i + len(n) - 1

            # col_move: 상하 이동 횟수
            col_move = 0
            for c in map(ord, n): # 문자열 n의 각 문자에 대해
                col_move += min(c - 65, 91 - c) # 상하 이동 횟수 계산

            # 전체 이동 횟수 구하기
            answer = min(answer, row_move + col_move)

    return answer
  • 조이 스틱 문제에서 상하로 움직이는 것은 최적화할 수 없다는 점
  • 문자를 움직이는 횟수를 줄이기 위해서 미리 제일 끝에 'a' 를 위치 시키고 이를 제거하고 수를 움직인 횟수를 샌다는 생각을 하는 것이 어려웠다
profile
코딩

0개의 댓글