[ 프로그래머스 / PYTHON ] 조이스틱

yujeongkwon·2022년 5월 5일
0

프로그래머스 / PYTHON

목록 보기
27/77

구현이 어려움 ㅠ 연속된 A를 발견했을 때 돌아가는(왼쪽 오른쪽으로) 개수를 세준다 라는 것을 생각하는 것이 관건

문제 설명

프로그래머스 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.

내 코드

처음엔 가장 많은 A의 개수를 기준으로 돌아갈려고 했는데 ( 왼쪽 끝, 오른쪽 끝 A 처리해줌) 안돼서 남 거 보고함
1. 위 아래 올리는 조이스틱 움직이는 거 세면서 A를 만나면 (연속된) A 개수 세기
2. 원래 move(처음엔 len(name)-1)와 정방향으로 가다가 (연속된) A를 만나면 왼쪽으로 다시 왔던길 돌아서 뒤로 가는 경우 min 처리
3. move와 뒤로(오른쪽) 가다가 (연속된) A를 만나면 다시 정방향으로 돌아가는 경우 비교해서 min 처리

! name이 'AAABBABAB' 나 'BBBBBBABAAA' 같이 양쪽에 연속된 A를 만나도 수식 'idx 2 + len(name) -index', '(len(name)-index)2 + idx' 에 의해 처리됨

EX) 'BBBBBBABAAA'경우 for문의 idx가 7일때, while문에서 마지막 index의 값은 10,
(len(name)-index)2 + idx 수식에 의해 02+idx(7) = 7로 처리 ok - 조이스틱을 왼쪽, 오른쪽으로 움직였을 때의 개수
여기에 위아래로 움직인 개수만큼 더해주면 됨.

def solution(name):
    answer,index = 0,0
    move=len(name) -1
    for idx,s in enumerate(name):
        if ord(s) - 65 < 13:    answer += ord(s) - 65
        else:   answer += 25 - (ord(s) - 66)
        
        index = idx +1
        
        while index < len(name) and name[index] == 'A':
            index += 1
            
        move = min(move,idx *2 + len(name) -index)
        move = min(move, (len(name)-index)*2 + idx)
            
    return answer + move
profile
인생 살자.

0개의 댓글