-
[프로그래머스] 탐욕법(Greedy) 02. 조이스틱카테고리 없음 2021. 3. 16. 17:01
programmers.co.kr/learn/courses/30/lessons/42860
문제설명
조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다.
ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA조이스틱을 각 방향으로 움직이면 아래와 같습니다.
예를 들어 아래의 방법으로 "JAZ"를 만들 수 있습니다.
만들고자 하는 이름 name이 매개변수로 주어질 때, 이름에 대해 조이스틱 조작 횟수의 최솟값을 return 하도록 solution 함수를 만드세요.
제한사항
- name은 알파벳 대문자로만 이루어져 있습니다.
- name의 길이는 1 이상 20 이하입니다.
입출력 예
풀이
def solution(name): name_list = [min(ord(i) - ord('A'), ord('Z') - ord(i) + 1) for i in name] answer = 0 location = 0 while True: answer += name_list[location] name_list[location] = 0 if sum(name_list) == 0: break left = 1 right = 1 while name_list[location + right] == 0: right += 1 while name_list[location - left] == 0: print(location - left) left += 1 if left >= right: location += right answer += right else: location -= left answer += left return answer
각 글자들로 이동하는 횟수를 구하는 것이 문제의 핵심인데 모든 name이 A가 아닌 경우에는 별로 신경쓸 것이 없다. 한칸씩 이동하면서 변경하면 되지만 중간에 A인 글자가 있는 경우에는 왼쪽으로 이동할지 오른쪽으로 이동할지 고려해야한다 예를 들어 JAZ 의 경우 J (->) A (->) Z로 이동하면 2회 J (<-) Z 로 이동하면 1회이다.
먼저 필요한 알파벳이 A -> 갔을때와 <- Z로 했을때 중 작은 조작이 필요한 횟수를 구한다.
이 횟수의 경우는 name을 만들기 위해서 필수적으로 필요한 횟수이다.
이 횟수를 숫자로 표현하여 A인 경우 0 Z인 경우 1등으로 표현한다.
다음 글자가 0인동안 왼쪽과 오른쪽으로 이동하여 0이 아닌 글자가 먼저 나오는 쪽을 선택한다.
먼저 나온쪽에서 A에서 해당 글자로 변경할때 필요한 숫자만큼 answer에 더하고 해당 글자를 0으로 변경한다.
이 과정을 반복하여서 모든 글자가 0 (필요한 글자로 변경된 경우)가 되면 종료한다.