본문 바로가기
Algorithm/프로그래머스

[프로그래머스] [Python] Level2_조이스틱

by 은세라 2021. 10. 2.

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

 

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

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

programmers.co.kr

실패 코드

def solution(name):
    #유니코드로 변환하여 숫자 비교 A->65, Z->90, N->78 ,O->79
    cnt = 0
    ans = []
    arr = [ord(i) for i in name]
    print(arr)
    
    for a in arr:
        ans.append(min(a-65,91-a))
        
    print(ans)
    print(set(arr[1:len(arr)-1]))
    
    if set(arr[0:len(arr)]) == {65}: return 0
    elif set(arr[1:len(arr)-1]) == {65}: return sum(ans)+1
    else: return sum(ans)+len(arr)-1

주어진 테스트케이스는 다 통과했는데 "ZAAAZZZZZZZ"같은 경우를 해결하지 못했다.

중간에 A로만 이루어진 부분이 있는 경우를 발라내야하는데, 그걸 로직으로서 구현하기 너무 복잡해보였다.

그래서 결과 리스트를 만들고 더하는 방식은 하면 안된다는 결론이 나왔다.

=> 이 문제가 Greedy 탐욕법이 맞긴 맞군....

 

수정된 코드

def solution(name):
    #유니코드로 변환하여 숫자 비교
    ans, idx = 0, 0
    arr = [min(ord(i)-ord('A'), ord('Z')-ord(i)+1) for i in name]
    
    #이동방향 정하기
    while(True):
        ans += arr[idx]
        arr[idx] = 0
        
        if sum(arr) == 0: break
        
        left, right = 0, 0
        while arr[idx - left] == 0:
            left += 1
        while arr[idx + right] == 0:
            right += 1

        ans += left if left < right else right
        idx += -left if left < right else right
        
    return ans

 

댓글