본문 바로가기
문제풀이/Programmers

[프로그래머스💯] 코딩테스트 연습 > 탐욕법(Greedy) > 조이스틱

by 서상혁 2019. 11. 24.

<프로그래머스 문제풀이>

 

해답)

def solution(st):
    res = 0
    A_Count =0
    A_Max = 0  # 가장 긴 A묶음의 A 수
    A_StartIndex = 0
    A_EndIndex = 0
    vertical_count = 0
    start = True

    for i,v in enumerate(st):
        # 연속해서 나온 A 횟수 검사
        if v == 'A' and start == False :
            A_Count += 1
            if A_Count > A_Max:
                A_Max = A_Count
                A_EndIndex = i
        else:
            A_Count = 0

        # 알파벳이 N보다 크면 위로넘기는게 빠르다
        if ord(v) > ord('N'):
            count = ord('Z')-ord(v)+1
        else:
            count = ord(v) - ord('A')
        res += count 
        start = False
    
    # 가장 긴 A묶음의 인덱스
    A_StartIndex = A_EndIndex - A_Max + 1 
    
    # A가 시작이나 끝에있어서 안움직여도 되는경우
    if A_StartIndex ==0 or A_EndIndex == len(st)-1:
        res = res + len(st)-1 
        res -= A_Max # 이동안해도 되는 A만큼 빼준다.
    
    # A묶음이 중간에있는경우  예) AZAAAZ
    else:
        if A_StartIndex <= (len(st)-A_EndIndex-1):
            vertical_count = (A_StartIndex-1)*2 + (len(st)-A_EndIndex-1)
        else:
            vertical_count = (A_StartIndex-1) + (len(st)-A_EndIndex-1)*2
        res +=min(vertical_count, len(st)-1)
        
    return res

 

* ord 함수는 아스키코드를 돌려주는 함수!

 

출처: 프로그래머스 코딩 테스트 연습, https://programmers.co.kr/learn/challenges

728x90

댓글