[프로그래머스] 조이스틱 [탐욕법(Greedy)] [python] Level2

 

 

설계 및 구현

 

접근 방법

문제에 주어진 조건대로 좌우,상하이동에 따라 조작횟수를 더해 간 값을 반환하여 해결 할 수 있다.

 

mt_solution

def solution(name):
    # 1
    answer = 0
    name = list(name)
    index = 0
    
    while True:
        # ①
        right = 1
        left = 1
        # ②
        if name[index] != 'A':
            answer += min(ord(name[index]) - ord('A'), ord('Z') - ord(name[index]) + 1)
        # ③
        name[index] = 'A'
        
        # ④
        if name == ['A']*len(name):
            break
        # ⑤     
        for i in range(1,len(name)):
            if name[index+i] == 'A':
                right+=i
            else:
                break
        for i in range(1,len(name)):
            if name[index-i] == 'A':
                left+=i
            else:
                break
        # ⑥      
        if right>left:
            answer +=left
            index -= left
        else:
            answer +=right
            index += right
    # 2
    return answer

 

1. 조작 횟수를 쌓을 answer, index변수를 선언 초기화 name를 list화 해준다.

    while

    ① 좌우거리를 비교하기 위한 변수 right, left를 선언 하고 1로 초기화 한다.

    ② name[index] 값이 'A'가 아니라면 상하중 가까운 거리를 answer에 쌓는다

    ③ name[index] ='A'로 저장한다.

    ④ name이 'A'로만 이루어져 있다면 모든 조작횟수를 쌓은 것이니 break

    ⑤ 우로 'A'를 찾고 찾았다면 right를 i 만큼 더한다. 못 찾으면 for문 종료

        좌로 'A'를 찾고 찾았다면 left를 i만큼 더한다 못 찾으면 for문 종료

 

    ⑥만약 right>left  좌로 거리가 더 짧다면 answer에 거리만큼 쌓고 index 를 그거리만큼 감소시킨다

    아니라면  answer에 거리만큼 쌓고 index를 그 거리만큼 증가 시킨다.

2. 모든 조작횟수를 계산했다면 answer을 반환하여 해결 해준다.

반응형

+ Recent posts