알고리즘 풀이/프로그래머스

[Level 2] 조이스틱

mhko411 2021. 3. 16. 17:43
728x90

programmers.co.kr/learn/courses/30/lessons/42860

 

코딩테스트 연습 - 조이스틱

조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다

programmers.co.kr


접근

최소한의 조작으로 입력된 문자열로 변경해야한다.

조작은 문자열 변경을 위해 위, 아래로의 조작과 바꿀 문자열의 위치로 이동하는 왼쪽, 오른쪽의 조작이 있다.

이를 최소로 하기위해서는 바꿔야하는 문자에서 A와 Z까지의 거리 중 최소를 구하고 

현재 위치에서 왼쪽과 오른쪽으로 갈 때의 최소를 구하도록 한다.

 

구현

- 먼저 changed_name에 위, 아래로 변경 했을 때 최소 조작 횟수를 넣어준다.

- 반복문을 통해 changed_name의 합이 0이 되었을 때 종료한다.

- 현재 idx의 수를 answer에 저장하고 이동할 위치를 찾는다.

- 왼쪽과 오른쪽의 이동횟수를 1로 초기화하여 변경해야하는 위치를 찾는다.

- 이동 후에 left와 right를 비교하고 최솟값을 answer에 저장하고 idx를 업데이트한다.

def solution(name):
    answer = 0
    idx = 0
    # 입력받은 name의 각 위치에는 위, 아래 중 최소로 이동한 횟수가 담겨있다.
    changed_name = [min(ord(c)-ord('A'), ord('Z')-ord(c)+1) for c in name]
    
    while True:
        # 현재 위치에 해당하는 수를 최종해에 더한다.
        answer += changed_name[idx]
        # 변경했다면 그 자리를 0으로 만들어주고
        changed_name[idx] = 0
        # 모두 0이 되었을 때는 문자열 변경을 완료한 것이다.
        if sum(changed_name) == 0:
            break
        
        # 왼쪽과 오른쪽으로 이동해야한다.
        # 일단 이동횟수를 1부터 시작
        left = right = 1
        # 0이 나오지 않을 때까지 이동
        while changed_name[idx - left] == 0:
            left += 1
        while changed_name[idx + right] == 0:
            right += 1
        # 왼쪽과 오른쪽 중 최소 이동횟수를 더해주고
        # 현재 위치를 옮긴다.
        if left < right:
            answer += left
            idx += (-left)
        else:
            answer += right
            idx += right
    return answer

'알고리즘 풀이 > 프로그래머스' 카테고리의 다른 글

[Level 2] 스킬트리  (0) 2021.03.22
[Level 3] 거스름돈  (0) 2021.03.17
[Level 3] 단속카메라  (0) 2021.03.08
[Level 2] JadenCase 문자열 만들기  (0) 2021.03.08
[Level 3] 멀리 뛰기  (0) 2021.03.06