알고리즘

[웅's 프로그래머스] 조이스틱 - 파이썬(python) 풀이

CodeBoyEd 2021. 9. 22. 15:46

우선 아래 풀이에 앞서, ord 함수를 소개하고자 한다.

print(ord('A'))

위 결과 값으로는 65가 나오고 ord 함수는 character 의 ASCII code 값을 반환하는 함수이다. 나는 이 함수를 몰랐기에.... 아래 코드 처럼 panix 라는 dictionary 를 정의해서 풀었다 :(

 

이 문제를 풀 때는 오른쪽 왼쪽으로 움직이는 횟수위 아래로 움직이는 횟수를 분리해서 풀었다.

 

- 위 아래로 움직이는 문제는 해당 알파벳을 숫자로 변환한 후 Z 에서 내려가는 것과 A 에서 올라가는 것 중에 어느 것이 더 가까운지 비교해서 더하는 것으로 계산했다.

 

- 오른쪽 왼쪽으로 움직이는 횟수는 처음에 그냥 오른쪽으로 갔을 때와 왼쪽으로 갔을 때를 비교해서 더 적은 횟수를 기준으로 계산했지만 큰 오류가 존재했다.

 

바로 아래와 같은 경우이다.

"ABABAAAAAAABA"

이러한 경우에는 왼쪽으로 2번 갔다가 다시 돌아와서 오른쪽으로 4번 가는 것 즉, 총 8번 움직이는 것이 가장 빠른 루트이다.

이러한 부분까지 고려해야 했으므로 zig_zag 라는 list 를 만들어 A 가 아닌 요소 중 하나씩 선택하여 zig_zag 해서 접근해보았다. 그리고 그 중에서 가장 최소가 되는 값을 뽑아서 왼쪽으로만 갔을 경우와 오른쪽으로만 갔을 경우와 비교했다.

 

panix = {'A':1, 'B':2, 'C':3, 'D':4, 'E':5, 'F':6, 'G':7, 'H':8, 'I':9, 'J':10, 'K':11, 'L':12, 'M':13, \
    'N':14, 'O':15, 'P':16, 'Q':17, 'R':18, 'S':19, 'T':20, 'U':21, 'V':22, 'W':23, 'X':24, 'Y':25, 'Z':26}

def solution(name):
    location = []
    rev_location = []
    zig_zag_location = []
    total = 0
    for i in range(len(name)):
        if(name[i] != 'A'):
            seq = panix[name[i]]
            total += min(seq-1, 27-seq)
            location.append(i)
            rev_location.append(len(name)-i)
    
    for i in range(len(location)-1):
        temp = 0
        temp += location[i]*2
        temp += max(rev_location[i+1:])
        
        zig_zag_location.append(temp)

    total += min(max(location), max(rev_location), min(zig_zag_location))

    return total