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

Paek·2023년 2월 21일
0

코테공부

목록 보기
35/44

출처

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

문제


A로 구성된 기본문자열에서 Name과 같도록 만드는데, 최소한의 횟수로 움직이는 경우를 구하는 문제이다.

접근방법

배열로 만들어 실제로 움직여 가며 구하려고 했는데, 막상 보니 숫자만 계산해도 될 것 같았다. 가로로 움직이는 것과 세로로 움직이는 최소횟수를 세어 주기로 하였다.

세로로 움직이는 경우
이 경우는 어렵지 않다. A와 Z중 누가 가까운지에 따라 최솟값을 더해주면 된다.

가로로 움직이는 경우
이 경우는 좀 어렵다. 세로로 움직이는 경우를 처음부터 판단하는 반복문 안에서 수행하는데, 첫번째로, 연속되는 A의 갯수를 세주어야 한다. 이 길이를 토대로 연속되는 A의 앞 뒤 길이를 셀 수 있고, 앞에서 접근하는게 좋은지 뒤에서 접근하는게 좋은지 판단 할 수 있다.
순서대로 갈 경우는 len-1이 될것이고, 뒤돌아서 가는게 좋다면 현재 위치인 i만큼 왔다가 뒤로 가는 경우 (i * 2)에 연속된 A 뒤에 길이인 len - idx(연속된 A가 끝나는 지점)를 더해주는 값이 될 것이다.(Min을 활용)

min_move = min(min_move, i + i + len(name) - next_d)

추가적으로 뒤에 길이가 더 짧은경우, 뒤쪽부터 조작을 하여 앞으로 오는 코드인 len-idx * 2에 i를 더해주는 경우 또한 비교를 해주는 부분도 넣어주었다.

min_move = min(min_move, (len(name)-next_d) * 2 + i)

풀이

위의 과정을 코드로 구현하였다.

def solution(name):
    answer = 0
    name = list(name)
    min_move = len(name) - 1
    for i in range(len(name)):
        answer += min(ord(name[i]) - ord('A') , ord('Z') - ord(name[i]) + 1)
        next_d = i + 1
        up_d = 0
        while next_d < len(name) and name[next_d] == 'A':
            next_d += 1
        min_move = min(min_move, i + i + len(name) - next_d)
        min_move = min(min_move, (len(name)-next_d) * 2 + i)
    
    answer += min_move
        
    return answer
profile
티스토리로 이전했습니다. https://100cblog.tistory.com/

0개의 댓글